PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Zeichen Empfangen Rs232



3mal3
18.08.2006, 09:33
Hallo, beschäftige mich seit kurzem mit dem UART. Hab´s auch schon geschaft Sensordaten (einfache Aufzählung) auf dem Hterm auszugeben.
Frage/Problem: ich krieg´s nicht hin etwas vom Hterm in meinem µC zu senden.
Würde gerne sowas wie einen Stellweg eingeben können, und dieser wird anschließend vom Motor ausgeführt. In dem Tutorial von mikrocontroller.net stehen nur zwei Sätze dazu. Mir zu wenig um´s zu verstehen. Hab im Internet recherchiert und ein paar Beispiele ausprobiert, die haben alle nicht geklappt.
Kann mir jemand bitte ein Codeschnipsel zeigen der auf eine Eingabe vom Hterm wartet, und danach etwas ausführt. Bei mir wird entweder gleich ausgeführt, oder gar nicht. Wie gesagt, das mit der Eingabe klappt nie.
Danke.

michaelb
18.08.2006, 19:22
Hi,
hier mal ein Testprogramm. Ich hab zwei Leds an den Ports Portc2 und Portc3. Du kannst au ne andere Auswertung machen anstelle des An- und Ausschaltens der Leds. Bei mir läuft's mit HTerm, AVRTem usw...
Einstellungen: Baudrate: 9600, Databits: 8, Stopbits: 1, Parity: None



/*
Testprogramm:
Wartet auf Daten, wertet sie aus und gibt anschließend das
Ergebnis mittels zwei LEDs an Portc 2 und 3 aus.
Autor: Michael
Datum: 18.08.06
*/

//Header einbinden
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>

//Takt einstellen
#define F_CPU 16000000
//Baudrate angeben
#define USART_BAUD_RATE 9600
//Buadrate ausrechnen
#define USART_BAUD_SELECT (F_CPU/(USART_BAUD_RATE*16l)-1)

//Variable für den Empfang anlegen
volatile char zeichen;

//Methode zum initialisieren
void init(){
//Empfangsbit setzen
UCSRB |= (1<<RXEN);
//Empfangsinterrupt setzen
UCSRB |= (1<<RXCIE);
//Ausgerechneter Baudratewert ins Register schreiben
UBRRL = (unsigned char) USART_BAUD_SELECT;
DDRC = 0xFF;
}

SIGNAL(SIG_UART_RECV){
//Empfangsbuffer auslesen
zeichen = UDR;
//Irgendwas mit dem empfangenen Zeichen anstellen
//Hier ein Vergleich:
if(zeichen == 'a'){
PORTC = (1<<PC2);
}
else{
PORTC = (1<<PC3);
}
}

int main(void){
//Global Interrupts aktivieren
sei();
//Initialisierungmethode aufrufen
init();
//Endlosschleife
while(1){
}
}


Gruß Michi

Da das Programm in einer Endlosschleife ist, wertet es kontinuierlich die Daten aus und zeigt das Ergebnis an

RedBaron
18.08.2006, 21:49
Hallo 2mal3,

versuch es einmal mit folgendem Programm. Das sendet das empfangene Zeichen wieder zurück.


unsigned char ReadByte(void)
{ while ((UCSRA & 0x80) == 0); // Warten bis Zeichen vorhanden
return UDR;
}

void WriteByte(unsigned char data)
{ while ((UCSRA & 0x20) == 0); // wait for empty transmit buffer
UDR = data
}

voind init(void)
{ // prepare RS232
UCSRA = 0x00;
UCSRB = 0x00;
UCSRC = 0x86; // No Parity | 1 Stop Bit | 8 Data Bit
UBRRL = 0xCF; // 2400bps @ 8.00MHz

UCSRB |= (1 << TXEN); //enable transmit
UCSRB |= (1 << RXEN); //enable receive
}

int main(void)
{ Init();

while (1)
WriteByte(ReadByte());
}

Gruß RedBabron

3mal3
19.08.2006, 09:07
Danke für eure Hilfe.
Leider läufts trotzdem nicht.

Da die Codes von euch kommen, liegt es wohl an mir.
Bei dem Programm von michaelb sind alle LED´s an, keine geht aus!
Das Programm von RedBaron funktioniert auch nicht bei mir (fehlender Semikolon schon verbessert) Hab den RN-Control mit Atmega 32.
Ich vermute, dass ich falsch sende!
Wie gesagt ich hab den Hterm 0.6.5. Empfangen klappt super. Senden nie.
Ich sende indem ich bei Input -> Type -> eine a eingebe und enter drücke, oder wahlweise mit "Asend". Daraufhin erscheint unter der eingabezeile mein eingegebenes Zeichen nochmal. Hab ich jetzt gesendet oder nicht?
Es gibt da noch die Möglichkeit bei "Send on Enter" etwas einzustellen, hab alle Varianten probiert, keine Reaktion von meinem µC.
Habt Ihr noch eine Idee an was es liegen könnte, außer am Code?
Für eure Hilfe wäre ich echt dankbar.

michaelb
19.08.2006, 11:20
Hi 3mal3,


alle LED´s an, keine geht aus!

wie sind die Led's geschaltet? Bei mir sind beide gegen GND. Du musst den Code schon ändern wenn du die LED's an anderen Ports hast!
Ich hab die HTerm 0.6.3 beta... macht aber sicherlich nichts aus!
Natürlich musste bei Hterm erstmal die Settings einstellen
Dann bei Input Type ASC einstellen und bei Send on Enter none einstellen sonst sendet es noch was mit...
Dann halt ein a senden damit die LED leuchtet wenn ein anderes Zeichen gesendet wird müsste die andere angehen.

Gruß Michi

3mal3
19.08.2006, 15:50
Hi Roboter Genie,
nee stimmt schon, hab PORTC |=(1<<PC2); einfach mal so in die Main getippt und die LED geht halt aus. Es sind alle LED´s an beim anschalten, da gegen 5V geschaltet und Port auf Ground. Bei dir geehn die LED´s eben an wenn du ein 'a' sendest, bei mir müssten sie aus gehen.
Aber tun sie nicht!
Senden tu ich wie oben beschrieben, Settings müssten stimmen (Baudrate, Com etc..) ich kann ja Empfangen.
Sonst noch eine Idee an was es liegen könnte?
Falls nicht, trotzdem Danke für deine Mühe.