Hallo Leute,
ich brauche eure Hilfe!
ich habe geschaft bis jetzt ein Zeichnen auf mein Mikrokontroler(type:
AT90PWM von Atmel) zu empfangen und zu bewerten. Ich möchte jetzt eine
Zahle von 0 bis 360 empfangen und in einem register im mikro speicher,
damit wird getzhält bis zum diesem Zahl.
Bis jetzt löst sich immer der Receive-Interrupte bei Empfang eines
Zeichen.
Wie kann ich mehrer zeichenempfangen(zm: 3 byte für einen Zahl und
umwandlen in einem short variable)
ich danke euch voraus!
hier ist der code.
#include <avr/io.h>
#include <inttypes.h>
#include <stdint.h>
#include <avr/interrupt.h>
#define F_CPU 8000000
#define uart_baud 9600
#define UART_BAUD_SELECT ((F_CPU / (uart_baud * 16L))-1)
// Interrupt wird ausgelöst sobald neue Daten im USART-Empfangspuffer
liegen
SIGNAL(SIG_UART_RECV)
{ unsigned char buffer;
// Daten aus dem Puffer lesen ...
buffer = UDR;
switch (buffer)
{
case 'a': PORTE = 0x02;break;
case 'b': PORTE = 0x04;break;
default : break;
}
// ... warten bis der Sendepuffer leer ist ...
while ( !( UCSRA & (1<<UDRE)) )
;
// ... und gleich wieder zurück schicken
UDR = buffer;
}
/////////Init///////////////////
void uart_init(void)
{
UBRRH=(UART_BAUD_SELECT>>8);
UBRRL=UART_BAUD_SELECT;
UCSRB |= (1<<RXCIE)|(1<<TXEN) |(1<<RXEN); //Transmitter Enabled
,Emfpang enabl
UCSRC |= (0<<UMSEL)|(0<<UPM0)|(0<<USBS)|(1<<UCSZ1)|(1<<UCSZ0);
//Asynchron 8N1
}
/////////////Senden UART---->PC///////////////
void sendeByte(unsigned char data)
{
while (!(UCSRA & (1<<UDRE)));
UDR = data;
}
////////////////// SENEDE STRINGE
void put_string(unsigned char *zeiger)
{
while (*zeiger !=0)
{ while (!(UCSRA & (1<<UDRE)));
UDR=*zeiger;
*zeiger++;
}
}
int main(void)
{
DDRE=0xff;
PORTE=0x00;
uart_init();
unsigned char promt[]="Hallo";
put_string(promt);
sei();
while (1);
return 0;
}
1 | |
Beliebter Fehler. Das ist zu groß für eine int-Konstante, hänge da noch das Suffix L an:
1 | |
Mimo Abid wrote: > Wie kann ich mehrer zeichenempfangen(zm: 3 byte für einen Zahl und > umwandlen in einem short variable) Du fängst mal damit an, dass du die Zeichen in der UART Empfangsroutine nicht direkt auswertest, sonden in einem Buffer (einem char Array) zwischenspeicherst. Das machst du solange bis ein vereinbartes Ende Zeichen (zb. Carriage Return) daherkommt woraufhin du den Bufferinhalt zur 'vollständigen Zeile' erklärst, dir zb ein globales Flag auf true stellst und in der Hauptschleife denn Bufferinhalt abarbeitest ungefähr so
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
44 | |
45 | |
46 | |
47 | |
Obiges enthält noch keine Fehlerbehandlung und auch der Fall, dass eine Zeile nicht schnell genug abgearbeitet wurde ehe das nächste Zeichen eintrifft wurde nicht behandelt. Aber dafür kannst du dir ja selbst was ausdenken.
danke leute für den schnell antwort. Bei mir heisst die Interuppt Routine : ISR(USART_RXC_vect) ich bekomme den folgenden warning: ../UART_Senden.c:47: warning: `USART_RXC_vect' appears to be a misspelled signal handler weisst jemanden was das bedeuted?
'misspelled' heist 'falsche Schreibweise' oder 'Tippfehler'. Die komplette Fehlermeldung heist also übersetzt: `USART_RXC_vect' appears to be a misspelled signal handler 'USART_RXC_vect schaut nach einem falsch geschriebenen Namen für den Handler aus' Der Compiler hat also erkannt, dass du eine ISR schreiben willst, allerdings hat er mit dem Namen USART_RXC_vect nichts anfangen können. Seiner Meinung nach gibt es keine ISR die so heissen kann. Und wie wir alle wissen: Der Compiler hat immer recht.
und wie oder wo bekomme ich den richtigen Namem für mein interupt_receive routine?
Mimo Abid wrote: > und wie oder wo bekomme ich den richtigen Namem für mein > interupt_receive routine? Durch Nachschauen in der zugehörigen Dokumentation! MfG, Heidelbär ääähhh Blaubär
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.