Hallo,
nach anfänglichen Bascom Irritationenhabe ich mich nun entschlossen mal meine ersten Gehversuche in C zu starten. Die Bascom Sachen laufen einwandfrei, doch denke ich C ist sinnvoller.
Portabfragen usw. laufen, PWM auch, doch habe ich Probleme eine ISR für den Timer 0 Overflow Interrupt anzulegen.
Hier mal mein erster C Code (ist unsinn, nur zum üben):
Wie programmiere ich nun die ISR für den Timer 1 Überlauf?Code:#include <avr/io.h> #define F_CPU 1000000 /* Delay aufrufen mit _delay_ms(Wert_in_ms); */ #include <util/delay.h> #include <avr/interrupt.h> /* Bitfeld anlegen um einzelne Bits ansprechen zu können Bit setzen: BIT.bit1 = 1; Bit rücksetzen BIT.bit1 = 0; */ struct { unsigned char bit1 :1; unsigned char bit2 :2; unsigned char bit3 :3; unsigned char bit4 :4; unsigned char bit5 :5; unsigned char bit6 :6; unsigned char bit7 :7; unsigned char bit8 :8; } BOOL; void rinit (void) { /* Timer 0 für PWM */ TCCR0A |= (1<<COM0A1) | (1<<COM0A0) | (1<<WGM00); //Phase Correct PWM Mode TCCR0B |= (0<<CS02) | (1<<CS01) | (1<<CS00); //Prescaler 64 /* Timer 1 für Overflow */ TCCR1 |= (1<<CS12) | (1<<CS11) | (1<<CS10); //Prescaler 64 TIMSK |= (1<<TOIE1); //Timer1 ISR bei Overflow /* Eingänge / Ausgänge */ DDRB |= (0<<PB3) | (1<<PB2) | (1<<PB1) | (1<<PB0) ; //PB0..2 Ausgang, PB3 Eingang PORTB |= (1<<PB3); // Pull Up für PB3 aktivieren } int main(void) { sei(); //Alle Interrupts ein rinit(); //Register initialisieren BOOL.bit1 = 0; //bit1 initialisieren while (1) //Hauptschleife { if ( !(PINB & (1<<PB3))) //wenn PINB3=0 dann bit1 = 1 { BOOL.bit1=1; } if (BOOL.bit1==1) { PORTB |= (1<<PB0); } } //end while } //end main
Bevor ich Zukunft noch mehr so einfach zu beantwortende Fragen stelle:
Wie finde ich den die Bezeichner für die ISR´s, so das ich auch mal einen ADC Interrupt etc. programmieren kann ?
Achso, Entwicklungsumgebung AVR Studio und als Plug in Win AVR.
Danke!
Lesezeichen