This shows you the differences between two versions of the page.
|
pm:lab:lab4-2021 [2021/04/05 11:27] jan.vaduva [4. Exercitii] |
pm:lab:lab4-2021 [2021/04/05 12:15] (current) alexandru.predescu [4. Exercitii] |
||
|---|---|---|---|
| Line 133: | Line 133: | ||
| <hidden> | <hidden> | ||
| **Soluția** se găsește pe [[https://www.tinkercad.com/things/b2Yra0sAu2J-brilliant-lappi-habbi/editel?sharecode=LfeWdU6ojyT1VzyOCdjwU3ieYR6u4bV2-lEko5iVrTc|Tinkercad Interrupt]] | **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> | </hidden> | ||
| Line 140: | Line 222: | ||
| <hidden> | <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]] | **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> | </hidden> | ||
| ===== 5. Resurse ===== | ===== 5. Resurse ===== | ||