Hallo,
ich hab eine kleine Anwendung mit einem UART am ATMega16 gemacht.
Leider springt er beim SIG_UART_RECV-Interrupt nicht in die
entsprechende ISR. Kann mir jemand sagen was an meinem Code falsch
ist?
#include <avr/io.h>
#include <inttypes.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <delayms.c>
#ifndef F_CPU
#define F_CPU 16000000 /* Oszillator-Frequenz in Hz */
#endif
#define UART_BAUD_RATE 9600
#define UART_BAUD_CALC(UART_BAUD_RATE,F_OSC)
((F_CPU)/((UART_BAUD_RATE)*16L)-1)
//globals
volatile uint8_t command[4];
volatile uint8_t sreg_temp;
volatile uint8_t bytecountSen;
SIGNAL(SIG_UART_TRANS)
//ISR for transmitting via serial Interface
{
if (bytecountSen==3) //bytes 0 bis 2 sind gesendet, also die 3 byte
des Befehls
bytecountSen==0;
else
{
//while (!(UCSRA & (1<<UDRE))); //warten bis Senden moeglich
UDR = command[bytecountSen]; //der hier erzeugte Interrupt zird
getsartet nachdem
bytecountSen++; //dies ISR abgearbeitet ist.
}
}
SIGNAL(SIG_UART_RECV)
//§§§ Hier springt derATMega leider nicht hinein wenn ich ein Zeichen
//schick (via Br@y++ Terminal)
{
uint8_t data;
PORTC = 0xFF;
data = UDR;
switch (data)
{
case 'a': {ToggleBit(PORTC,PC0); break;}
case 'b': {ToggleBit(PORTC,PC1); break;}
case 'c': {ToggleBit(PORTC,PC2); break;}
case 'd': {ToggleBit(PORTC,PC3); break;}
default : {PORTC = 0x00;}
}
}
int main(void)
{
//uint8_t i;
//Initialization UART
UBRRH=(uint8_t)(UART_BAUD_CALC(UART_BAUD_RATE,F_CPU)>>8);
UBRRL=(uint8_t)UART_BAUD_CALC(UART_BAUD_RATE,F_CPU);
UCSRB |= (1<<RXEN) | (1<<TXEN); //enable RxD & TxD
UCSRB |= (1<<RXCIE) | (1<<TXCIE); //enable interrupts
//command generation
command[0] = 0xff;
command[1] = 0x01;
command[2] = 0x34;
command[3] = 0x00;
sei();
DDRC = 0xFF; //PortC = Ausgang
PORTC = 0x00; //PortC = alles auf Null (LEDs leuchten nicht)
//main loop
for(;;)
{
ommand[2] = 0x32; //50
bytecountSen = 1;
UDR = command[0];
delayms(300);
command[2] = 0x7F; //127
bytecountSen = 1;
UDR = command[0];
delayms(300);
}
}
danke fuer hinweise!
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.