Hallo,
beim ersten drüber schauen fällt auf, dass getch() nie aufgerufen wird.
Hast du die Hardware geprüft.
Gruß
Jens
Hallo Zusammen!
Meine Funktion getch() soll ein Zeichen über die UART-Schnittstellte einlesen. Jedoch passiert nichts.
Die Funktion putch() zum senden eines Zeichen geht einwandfrei.
Kann den Fehler einfach nicht finden. Vielleicht hat ja einer von euch eine Idee?
Vielen Dank!
Code:#define TAKT 16000000UL #define BAUD 9600UL #define US1 0xE0 #define IRM 0 #define IRR 1 #define IRL 2 #include <avr/io.h> #include <util/delay.h> #include <stdlib.h> #include "Motor/motor.h" #include "IR/irmessung.c" #include "US/usmessung.c" //----------------------------Fuktionen-----------------------------------------------------------------// //------------UART-Konfig---------------------// void initusart (void){ unsigned char x; UBRRL = (TAKT / (16UL * BAUD)) -1; UCSRB |= (1 << TXEN) | (1 << RXEN); UCSRC |= (1 << URSEL) | (1 << UCSZ1) | (1 << UCSZ0); x = UDR; } //------------Char senden---------------------// void putch (unsigned char x){ while ( ! (UCSRA & (1 << UDRE))); UDR = x; } //------------Char emfangen---------------------// unsigned char getch(void){ while (!(UCSRA & (1 << RXC))); return UDR; } //------------Befehl einlesen---------------------// void befehleinlesen (unsigned char *pbefehl, unsigned int anz){ unsigned char zwbef=0; unsigned char zwerg=0; zwbef=0xFF; *pbefehl = zwbef >> 7; //Motorbefehl if(*pbefehl == 0x01){ zwerg=zwbef; zwerg= zwerg & 0x60; *(pbefehl+1)= zwerg >> 5; zwerg=zwbef; zwerg=zwerg & 0x10; *(pbefehl+2)= zwerg >> 4; zwerg=zwbef; zwerg=zwerg & 0x0F; *(pbefehl+3)= zwerg; zwbef=0xFF; *(pbefehl+4)= zwbef; } //Sensorbefehl if(*pbefehl == 0x00){ zwerg=zwbef; zwerg= zwerg & 0x70; *(pbefehl+1)= zwerg >> 4; } } //----------------------------Hauptprogramm-------------------------------------------------------------// int main (void){ // Variablen unsigned char i=0; unsigned char vor=1; //Motorrichtung unsigned char rck=0; //Motorrichtung unsigned char wert=0; //IR Messwert unsigned char befehl[5]; //Befehlsspeicher unsigned char empfang // Programmstart initusart(); while(1){ empfang=getch(); getch(); befehleinlesen(befehl,5); _delay_loop_2 (6000); _delay_loop_2 (6000); for(i=0;i<=4;i++) putch(befehl[i]); /* //IR-Messen wert=irmessung(1); putch(wert); _delay_loop_2 (6000); */ } return 0; }
Hallo,
beim ersten drüber schauen fällt auf, dass getch() nie aufgerufen wird.
Hast du die Hardware geprüft.
Gruß
Jens
Hallo i-wizard,
Ach wie klingt mir das vertraut. Vor ´nem halben Monat hatte ich ganz genau den gleichen Stand . Trotz meiner Einschätzung, dass mein damaliger Thread nicht lesenswert ist (der Fehler war einfach zuuuuu doof) hilft er Dir vielleicht weiter. Damit will ich nicht sagen, dass Dein Problem doof ist ! ! !Zitat von i-wizard
Ciao sagt der JoeamBerg
Wenn ich am Controller den Rx Pin mt einem Oszi beobachte kommt dort ein Signal an. Es muss also ein Softwareproblem sein.
wie Jenso schon bemerkt hat, WO und WIE hast du dein getch denn eingesetzt ? in deinem Quellcode jedenfalls wird es nie verwendet, dein problem ist SO nicht verständlich, poste mal bitte etwas code zu dem wie du es getestet hast
So habe mal 2 Variant wie ich getch() einsetzen will eingefügt. Wenn ich es nach der for-SChleife einfüge wird diese 1x durchlaufen.
naja klar, wenn getch() da in der schleife steht wartet er jedesmal das ein byte ankommt, aber WO wertest du denn den "empfang" aus ?
mach doch mal testhalber ne simple echoschleife
Code:while(1){ byte empfang = getch(); putch(empfang); }
Es soll ja warten bis ein Byte kommt und ganau da liegt das Problem.
Wenn ich ein Byte sende macht er nicht weiter.
Das mit der Echo schleife habe ich schon probiert, da kommt nix.
Das Byte kommt aber elektrisch am Port an, hab das mit dem Oszi nachgemessen.
Die Fuktion putch() geht einwandfrei!
mir ist grade bei deiner init() eine unstimmigkeit aufgefallen, kannst du SICHER sagen das gesendete bytes auch SO ankommen wie sie sollen ?
so wird es im datenblatt EMPFOHLENCode:UBRRL = (TAKT / (16UL * BAUD)) -1; in UBRR = (TAKT / (16UL * BAUD)) -1; ändern , ist schliesslich ein 16bit register und du spricht nur das low-byte an versuch auch mal alternativ UBRRH = (unsigned char)(baud>>8); UBRRL = (unsigned char)baud;
wenn jetzt nix geht, sag mir noch fix welchen prozessor du hast, dann probier ichs selber, prüfe nochmal deine hardware, by the way ... wie sieht DIE eigentlich aus ?
Es handelt sich um einen ATmega32 mit 16Mhz.
Verdrahtungstechnisch scheint alles ok zu sein da ich die Bytes ja am RX -Pin des ATmega32 mit dem Oszi messen kann.
UBRR geht nicht direkt zu beschreiben. Habe es dann mit deiner Idee des schiebens Probiert also URBBL und URBBH. Wie bisher senden geht immer aber empfangen nicht.
Was ich noch nicht angemerkthabe: Es hat schon mal funktioniert!
Danke für die Tipps!!
Lesezeichen