This shows you the differences between two versions of the page.
pm:lab:lab4-2021 [2021/04/05 09:58] jan.vaduva [4. Exercitii] |
pm:lab:lab4-2021 [2021/04/05 12:15] (current) alexandru.predescu [4. Exercitii] |
||
---|---|---|---|
Line 122: | Line 122: | ||
{{ pm:lab:PB1.png?500 | PB1 }} | {{ pm:lab:PB1.png?500 | PB1 }} | ||
+ | |||
+ | <hidden> | ||
+ | **Soluția** se găsește pe [[https://www.tinkercad.com/things/b2Yra0sAu2J-brilliant-lappi-habbi/editel?sharecode=LfeWdU6ojyT1VzyOCdjwU3ieYR6u4bV2-lEko5iVrTc|Tinkercad TMP36]] | ||
+ | </hidden> | ||
**Task 1** Folosind cod specific de microcontroller, cititi valoarea potentiometrului doar atunci cand se apasa un buton. | **Task 1** Folosind cod specific de microcontroller, cititi valoarea potentiometrului doar atunci cand se apasa un buton. | ||
Line 127: | Line 131: | ||
{{ pm:lab:PB2.png?500 | PB2 }} | {{ pm:lab:PB2.png?500 | PB2 }} | ||
+ | <hidden> | ||
+ | **Soluția** se găsește pe [[https://www.tinkercad.com/things/b2Yra0sAu2J-brilliant-lappi-habbi/editel?sharecode=LfeWdU6ojyT1VzyOCdjwU3ieYR6u4bV2-lEko5iVrTc|Tinkercad Interrupt]] | ||
+ | |||
+ | <code> | ||
+ | void timer_setup(){ | ||
+ | // set timer A for 10ms | ||
+ | TCCR0A = 0; | ||
+ | TCCR0B = 0; | ||
+ | TCNT0 = 0; | ||
+ | |||
+ | OCR0A = 156; // compare match -> 10ms | ||
+ | TCCR0A |= (1 << WGM01); // CTC mode | ||
+ | TCCR0B |= ((1 << CS02) | (1 << CS00)); // 1024 prescaler | ||
+ | TIMSK0 |= (1 << OCIE0A); | ||
+ | |||
+ | // Enable timer as source | ||
+ | ADCSRB |= ((1 << ADTS0) | (1 << ADTS1)); | ||
+ | } | ||
+ | |||
+ | void button_setup(){ | ||
+ | // Select INT0 as trigger source | ||
+ | ADCSRB = 0; | ||
+ | ADCSRB |= (1 << ADTS1); | ||
+ | |||
+ | // Enable INT0 | ||
+ | EICRA |= (1 << ISC00); | ||
+ | EIMSK |= (1 << INT0); | ||
+ | } | ||
+ | |||
+ | |||
+ | void setup() | ||
+ | { | ||
+ | | ||
+ | // disable interrupts | ||
+ | cli(); | ||
+ | | ||
+ | ADMUX = 0; | ||
+ | /* AVCC with external capacitor at AREF pin */ | ||
+ | ADMUX |= (1 << REFS0); | ||
+ | |||
+ | ADCSRA = 0; | ||
+ | /* set prescaler at 128 */ | ||
+ | ADCSRA |= (7 << ADPS0); | ||
+ | |||
+ | // Enable auto-trigger | ||
+ | ADCSRA |= (1 << ADATE); | ||
+ | // Enable Intrerupt | ||
+ | ADCSRA |= (1 << ADIE); | ||
+ | |||
+ | // Set button as trigger source | ||
+ | button_setup(); | ||
+ | |||
+ | // Select Timer as trigger source | ||
+ | //timer_setup(); | ||
+ | | ||
+ | /* enable ADC */ | ||
+ | ADCSRA |= (1 << ADEN); | ||
+ | |||
+ | // Enable interrupts | ||
+ | sei(); | ||
+ | Serial.begin(9600); | ||
+ | } | ||
+ | |||
+ | ISR(ADC_vect){ | ||
+ | Serial.println(ADC); | ||
+ | } | ||
+ | |||
+ | ISR(INT0_vect) | ||
+ | { | ||
+ | Serial.println("Button Pressed!"); | ||
+ | } | ||
+ | |||
+ | ISR(TIMER0_COMPA_vect){ | ||
+ | // Even if this does nothing. It has to be here | ||
+ | // Else the code just doesn't work. Still don't know why. | ||
+ | // [AP] Deoarece ai activat intreruperea de compare match: TIMSK0 |= (1 << OCIE0A); | ||
+ | // [AP] Astfel, daca nu e definit ISR-ul se va reseta uC | ||
+ | } | ||
+ | |||
+ | void loop() | ||
+ | { | ||
+ | delay(50); | ||
+ | } | ||
+ | </code> | ||
+ | </hidden> | ||
**Task 2** Folosind cod specific microcontrollerului cititi valoarea potentiometrului o data la 10ms. Pentru aceste exercitiu trebuie sa folositi ADC-ul sa porneasca o conversie automat in functie de un timer. | **Task 2** Folosind cod specific microcontrollerului cititi valoarea potentiometrului o data la 10ms. Pentru aceste exercitiu trebuie sa folositi ADC-ul sa porneasca o conversie automat in functie de un timer. | ||
<note>Codul trebuie testat pe Arduino, Tinkercad nu are suport pentru Auto-trigger.</note> | <note>Codul trebuie testat pe Arduino, Tinkercad nu are suport pentru Auto-trigger.</note> | ||
+ | |||
+ | <hidden> | ||
+ | **Soluția** se găsește pe [[https://www.tinkercad.com/things/grYhoajb3sd-exquisite-hango-waasa/editel?sharecode=gNPGmOuI6oZBx3bp-q-S7NlxWoz_wRwWZm9LJK4DHbI|Tinkercad Potentiometer]] | ||
+ | |||
+ | <code> | ||
+ | void timer_setup(){ | ||
+ | // set timer A for 10ms | ||
+ | TCCR0A = 0; | ||
+ | TCCR0B = 0; | ||
+ | TCNT0 = 0; | ||
+ | |||
+ | OCR0A = 156; // compare match -> 10ms | ||
+ | TCCR0A |= (1 << WGM01); // CTC mode | ||
+ | TCCR0B |= ((1 << CS02) | (1 << CS00)); // 1024 prescaler | ||
+ | TIMSK0 |= (1 << OCIE0A); | ||
+ | |||
+ | // Enable timer as source | ||
+ | ADCSRB |= ((1 << ADTS0) | (1 << ADTS1)); | ||
+ | } | ||
+ | |||
+ | void setup() | ||
+ | { | ||
+ | pinMode(2, INPUT_PULLUP); | ||
+ | | ||
+ | // disable interrupts | ||
+ | cli(); | ||
+ | | ||
+ | ADMUX = 0; | ||
+ | /* AVCC with external capacitor at AREF pin */ | ||
+ | ADMUX |= (1 << REFS0); | ||
+ | |||
+ | ADCSRA = 0; | ||
+ | /* set prescaler at 128 */ | ||
+ | ADCSRA |= (7 << ADPS0); | ||
+ | |||
+ | // Enable auto-trigger | ||
+ | ADCSRA |= (1 << ADATE); | ||
+ | // Enable Intrerupt | ||
+ | ADCSRA |= (1 << ADIE); | ||
+ | | ||
+ | // Select Timer as trigger source | ||
+ | timer_setup(); | ||
+ | | ||
+ | /* enable ADC */ | ||
+ | ADCSRA |= (1 << ADEN); | ||
+ | |||
+ | // Enable interrupts | ||
+ | sei(); | ||
+ | Serial.begin(9600); | ||
+ | } | ||
+ | |||
+ | ISR(ADC_vect){ | ||
+ | Serial.println(ADC); | ||
+ | } | ||
+ | |||
+ | ISR(TIMER0_COMPA_vect){ | ||
+ | // Even if this does nothing. It has to be here | ||
+ | // Else the code just doesn't work. Still don't know why. | ||
+ | // [AP] Deoarece ai activat intreruperea de compare match: TIMSK0 |= (1 << OCIE0A); | ||
+ | // [AP] Astfel, daca nu e definit ISR-ul se va reseta uC | ||
+ | } | ||
+ | |||
+ | void loop() | ||
+ | { | ||
+ | delay(50); | ||
+ | } | ||
+ | </code> | ||
+ | </hidden> | ||
===== 5. Resurse ===== | ===== 5. Resurse ===== | ||