meldano
28.10.2007, 18:18
Hallo,
nach anfänglichen Bascom Irritationen :-$ habe 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):
#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
Wie programmiere ich nun die ISR für den Timer 1 Überlauf?
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!
nach anfänglichen Bascom Irritationen :-$ habe 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):
#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
Wie programmiere ich nun die ISR für den Timer 1 Überlauf?
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!