Archiv verlassen und diese Seite im Standarddesign anzeigen : STK500 USART Funktioniert nicht
Wiederstand
07.01.2011, 19:21
Hallo,
Ich versucher derzeit mit einem ATMEGA8 (12Mhz von einem externen Quarz) auf einem STK500 Daten an meinen Rechner (Hyperterminal) zu senden.
Am rechner kommt aber nichts an. Das zweiadrige Kabel für RS232 Spare habe ich an RXD und TXD angeschlossen (also Pin eins und zwei von Portd D).
Der XTAL1 Jumper auf dem STK500 steckt und OSCSEL Jumper steckt links (aslo von Pin zwei nach Pin drei - laut Handbuch "On-board crystal signal conected").
Um zu überprüfen, ob die Baudrate richtig eingestellt ist habe ich in mein Programm ien paar Zeilen eingefügt, die dafür sorgen, dass die Leds blinken, wenn 1000mal eine Naricht versendet wurde. In ca. 41Sekunden gehen die Leds 50 mal an bzw aus (also erfolgen in dieser zeit 50.000 Sendungen).
Ich habe bemerkt, das der Cursor(ich meine den blinkenden Strich) im Terminal sofort erscheint, auch wenn er gerade erst verschwunden ist, wenn ich das STK500 einschalte. Das heißt es wird wahrscheinlich schon ein Kommunikationspartner gefunden.
Hier der Code:
#include <avr/io.h>
#define F_CPU 12000000UL
#define BAUDRATE 9600UL
#define UBBR F_CPU/16/BAUDRATE-1
uint16_t zaehler = 0;
uint8_t Zustd = 0;
void usart_init(void){
UBRRH = UBBR >> 8; //Baudrate einstellen
UBRRL = UBBR & 0xff; //Baudrate einstellen
UCSRB = (1<<TXEN); //Transmitter (Daten schicken) aktivieren
UCSRC = (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ0); //8Bit länge und 1 Stoppbit; Asynchron
}
void usart_send(uint8_t Sendung){
while (!(UCSRA & (1<<5))); //warten bis Senden moeglich (UDRE)
UDR = Sendung;
}
int main(void){
DDRB = 0xff;
PORTB = 0x00;
usart_init();
while(1){
usart_send(1);
zaehler++;
if (zaehler >= 1000)
{
zaehler = 0;
if(Zustd == 0){
PORTB = 0xFF;
Zustd = 1;
}
else{
PORTB = 0x00;
Zustd = 0;
}
}
}
}
Sind zwsichen STK500 und PC tatsächlich nur Rx und Tx oder gibts da auch noch ne gemeinsame Masseleitung? Falls letztere fehlt, kann nichts kommen.
Wiederstand
08.01.2011, 19:12
Ich glaube die Masse fügt das STK500 selber hinzu. Für RXD und TXD gibts bloß nen kabel weil die ja nicht immer mit PORTD verbunden sein können.
Nur "Glauben" oder ist da sicher Masse vom STK mit Pin 5 des COM-Ports bzw. PC-Gehäuse verbunden? Einach mal nachprüfen/-messen.
Wiederstand
09.01.2011, 00:56
Naja, ich kann das schlecht messen, weil da der pegelwandler dazwischen hängt...
wenn ich vom normalen µC Masse mit dem Durchgangsmesser messe geht das nicht.
Aber es ist eigentlich sehr unwahrscheinlich, dass das STK500 die Masse nicht bietet. In der Anleitung steht auch nur, dass ich RXD und TXD connecten muss und in anderen Threads habe ich glaub ich gelesen, dass man keine Masse oder so extra connecten muss...
Masse (GND) ist aber unbedingt notwendig, sonst fehlt das Bezugspotenzial. Dass die Datenübertragung dann nicht klappt ist ja kein Wunder.
Der Pegelwandler kümmert sich "nur" um Rx und Tx, die Masse wird durchverbunden.
Wiederstand
09.01.2011, 11:55
Ich hatte den flaschen (Pin1) vom RS232 gemessen :roll: ,
es besteht doch ein Durchgang von Masse zu Pin5 vom RS232!
* Was für ein Kabel hast du denn verwendet?
* Ich sehe in deinem Programm keine Einstellung für DDRD, PORTD. Der Tx-Pin muss als Ausgang geschaltet werden
* Welches Terminal verwendest du? Ist das auch auf die selbe Baudrate und das selbe Datenformat eingestellt? (Anzahl Bits, Parity, Stopbits)
Wiederstand
09.01.2011, 13:30
Cool ich hab jetzt PORTD als Ausgang gestezt und wenn ich das Board ausschalte kommt manchmal was an (nach vielleicht 10 mal an/ausschalten hatte ich dann xx~x~x im Terminal stehen - ich habe den zu senenden Wert auf 'x' gestellt)
Jetzt blinken die Leds an PORTB alledings nicht mehr, das heißt eigentlich das Programm läuft nicht...
Ich benutze Hyperterminal und ich glaube, dass ich alles richtig eigestellt hab (1 stoppbit; 8 Datenbits, kein Parity)
Als Kabel verwende ich das Kabel, mit dem ich den µC auch bespiele - das müsste also funktionieren.
PORTD darf nicht komplett auf Ausgang eingestellt sein. Der Rx-Pin muss logischerweise ein Eingang sein. Zeig bitte nochmal dein aktuelles Programm, oder hast du nur diese eine Zeile geändert? Dann sehen wir weiter.
Masse (GND) ist aber unbedingt notwendig, sonst fehlt das Bezugspotenzial. Dass die Datenübertragung dann nicht klappt ist ja kein Wunder.
Der Pegelwandler kümmert sich "nur" um Rx und Tx, die Masse wird durchverbunden.
Das STK500 hat Zwei 9 poolige Sub-D Buchsen an denen ein Handelsübliches RS232 Kabel angeschlossen wird. Man braucht beide Buchsen wenn man einen Chip an RS232 betreiben will.Also auch 2 cm Schnittstellen am PC (wenn man nicht dauernd umstöpseln will).
Wenn man das STK so hält das die Sub-D Buchsen oben liegen, ist die linke für's SDK zum Proggen, die rechte um eine Verbindung mit den Chip selber herzustellen.
Die 2 adrige Brücke stellt dann nur die Verbindung von den Chip Pins und den Pegelwandler her. Es ist also richtig das die Masse vom STK selber hardwaremäßig hergestellt wird.
Viele (auch ich) lernen es nie was RX TX ist und müssen immer mal wieder das Verbindungskabel "umdrehen" damit die Verbindung klappt. :-)
Gruß Richard
PORTD darf nicht komplett auf Ausgang eingestellt sein. Der Rx-Pin muss logischerweise ein Eingang sein. Zeig bitte nochmal dein aktuelles Programm, oder hast du nur diese eine Zeile geändert? Dann sehen wir weiter.
Wenn man $Baud=xxxxxxx Eingetragen hat, werden die Pins für die UART automatisch richtig gesetzt, da muss nichts mehr "von Hand" gesetzt werden! Das gleiche gilt auch für Software UADT.
Gruß Richard
Wiederstand
09.01.2011, 14:28
Ja ich weiß, dass nur ein Sub-D stecker für USART bestimmt ist und ich stöpsle immer um...
Hier der Code:
#include <avr/io.h>
#define F_CPU 12000000UL
#define BAUDRATE 9600UL
#define UBBR F_CPU/16/BAUDRATE-1
uint16_t zaehler = 0;
uint8_t Zustd = 0;
void usart_init(void){
UBRRH = UBBR >> 8; //Baudrate einstellen
UBRRL = UBBR & 0xff; //Baudrate einstellen
UCSRB = (1<<TXEN); //Transmitter (Daten schicken) aktivieren
UCSRC = (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ0); //8Bit länge und 1 Stoppbit; Asynchron
}
void usart_send(void){
while (!(UCSRA & (1<<5))); //warten bis Senden moeglich (UDRE)
UDR = 'x';
}
int main(void){
DDRB = 0xff;
DDRD = 0xff;
PORTB = 0x00;
usart_init();
while(1){
usart_send();
zaehler++;
if (zaehler >= 1000)
{
zaehler = 0;
if(Zustd == 0){
PORTB = 0xFF;
Zustd = 1;
}
else{
PORTB = 0x00;
Zustd = 0;
}
}
}
}
Kann PORTB die Taktquelle stören?
Ja ich weiß, dass nur ein Sub-D stecker für USART bestimmt ist und ich stöpsle immer um...
Hier der Code:
#include <avr/io.h>
#define F_CPU 12000000UL
#define BAUDRATE 9600UL
#define UBBR F_CPU/16/BAUDRATE-1
uint16_t zaehler = 0;
uint8_t Zustd = 0;
void usart_init(void){
UBRRH = UBBR >> 8; //Baudrate einstellen
UBRRL = UBBR & 0xff; //Baudrate einstellen
UCSRB = (1<<TXEN); //Transmitter (Daten schicken) aktivieren
UCSRC = (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ0); //8Bit länge und 1 Stoppbit; Asynchron
}
void usart_send(void){
while (!(UCSRA & (1<<5))); //warten bis Senden moeglich (UDRE)
UDR = 'x';
}
int main(void){
DDRB = 0xff;
DDRD = 0xff;
PORTB = 0x00;
usart_init();
while(1){
usart_send();
zaehler++;
if (zaehler >= 1000)
{
zaehler = 0;
if(Zustd == 0){
PORTB = 0xFF;
Zustd = 1;
}
else{
PORTB = 0x00;
Zustd = 0;
}
}
}
}
Kann PORTB die Taktquelle stören?
Solange Du nicht an den IO Pords für die Serielle fummels sollte nichts stören. Beim Programm kann ich nicht helfen, C ist nicht so mein "Ding". :-)
Gruß Richard
Jetzt bin ich fündig geworden :) Deine Codewortlänge stimmt nicht. Du sendest 6 Bit anstatt 8 Bit! (Datenblatt Atmega Seite 157 Table 58 )
UCSRC = (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ0);
Auf den ersten Blick fällt einem da ja nichts auf.
aber es muss heißen
UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
Du hast einfach das UCSZ0-Bit doppelt eingegeben. :-b
Grüße,
Bernhard
Wiederstand
09.01.2011, 15:46
YEAHHHHHHHH es funktioniert!!!!!!!!!!!!!!
Tausend Dank!!!!!!!
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.