Hallo, Nachdem ich einen Tag lang ohne Erfolg gesucht, gelesen und probiert habe, brauche ich dringend eine Anregung zu meiner Fehlerquelle. Meine Hardware ist: Olimex P28 Board mit ATmega8, USBprog, Windowspc, also klassischer Fall von Starterkit gekauft. Als Software benutze ich das AVRstudio mit C. Mein Problem ist: Um es am Bspl. zu lernen, wollte ich das Programm, dass Olimex zur Verfügung stellt um ein Echo vom uC über den UART zu bekommen zum laufen bringen. Also das AVR-P28-UART.zip von olimex.com. Leider läuft es nicht. Ich habe folgendes schon gefunden und korrigiert: -RX und TX vom MAX232 mit PINs vom uC verbunden -Netzteil auf richtige Spannung einstellen (6V) -J1 ganz ohne Jumper betreiben (Is glaube ich egal) -#define F_CPU 8000000 statt #define atmega8... in code eingesetzt, um sicherzugehen -Mit AVR die fuse SUT CKSEL auf Ext Crystal/Resonater med freq 16K CK + 64ms gestellt um externen Quarz zu benutzen -"calibrate for frequency" unter dem AVR reiter "advanced" auf 8 Mhz gestellt -Sichergestellt, dass es das richtige Comportkabel ist -Hyperterminal auf 9600 baud, 8-N-1 eingestellt ("keine" Flusssteuerung) Trotzdem bekomme ich nichts zurück, auf das was ich eintippe ins Hyperterminal. Nicht mal Datensalat. Als letztes habe ich den uC aus der Fassung geklaubt und die beiden Steckplätze in denen der TX und RX pin sind überbrückt. Dann bekomme ich im Hyperterminal alles was ich eintippe doppelt. Also, bis zum uC hin scheint es zu funktionieren, aber was ist falsch? Ich weiß nicht weiter und bin mehr verwirrt, als das ich etwas gelernt hätte. Danke für eure Anregungen
> Dann bekomme ich im Hyperterminal alles was ich eintippe doppelt.
Welches Programm genau?
Probiert mal HTerm .. da ist Eingabe und Empfangsfenster getrennt.
Das Programm ist auch sehr gut
Programmiere mal eine Schleife mit do { delay_ms(500); LED_EIN; delay_ms(500); LED_AUS; }while(1); Falls die Zeit mehr als 3% von einer Sekunde abweicht, stimmt Dein Takt nicht. Gruß, Bernd
warum nimmst du nen externen? Nimm den internen 8MHz und setz die Register wie sie sollen. Das funzt meistens. wenn das nicht geht, liegt die Fehlerquelle vllt woanders. Schon mal geschaut ob der uC überhaupt aufstartet? Resettet er aus eirgend einem Grund vielleicht? Versorgung, Masse und Reset-Pegel schon direkt am Chip gemessen? Grüßle!
> Trotzdem bekomme ich nichts zurück, auf das was ich eintippe ins > Hyperterminal. Zitat: Ich mach zwei Schritt auf einmal und fall aufs Maul ;-) Das allererste Programm, das ein uC-Entwicklungssystem von mir um die Ohren bekommt ist das "Hello World!" des kleinen Mannes: eine blinkende LED. Wenn die jetzt zudem mit einer erwarteten Zeit von 1 sec. blinkt, und für eine Minute 60 mal an und ausgeht, passt schon mal der Takt. Dann kommt die SIO. Aber erst mal nur 1 Richtung (vom uC zum PC). Wenn das klappt die andere: den empfangenen Char auf 8 LEDs. Und jetzt erst wird empfangen und gesendet.
Danke soweit für eure Hilfsbereitschaft. @Daniel: Es ist das Windows Hyperterminal, eingestellt auf 9600, 8 bit, 1 Stopbit, keine paritätsbits. @Bernd W. und Lothar: blinken geht. Er bleibt brav im Takt mit einer Minute. Ist es ein Softwarefehler? Hier etwas selbstgeschriebenes, das auch nicht wolte. Eigentlich habe ich mich an die Vorlagen gehalten (AVR Buch Mittermayr) gehalten:
1 | #include <avr/io.h> |
2 | #include <util/delay.h> |
3 | #include <stdint.h> |
4 | |
5 | #define F_CPU 8000000UL //Prozessorgeschwindigkeit: 8 MHz//
|
6 | #define OSCSPEED 8000000UL //ext. Takt definieren: Quarz 8Mhz//
|
7 | uint32_t BAUDRATE = 9600; //Baudrate festlegen: 9600 // |
8 | #define UBRR_FORMEL ((F_CPU/(16*BAUDRATE))-1) //ATmel Formel//
|
9 | |
10 | char r; //hier kommt ein Testbuchstabe rein// |
11 | |
12 | int main (void) |
13 | {
|
14 | r = 'R'; //R ist der Testbuchstabe// |
15 | UBRRH = (unsigned char) (UBRR_FORMEL >> 8); |
16 | UBRRL = (unsigned char) (UBRR_FORMEL); |
17 | |
18 | UCSRC = (1<<URSEL)|(3<<UCSZ0); |
19 | //asynchrone Übertragung, 8 bit daten, no parity, 1 stoppbit//
|
20 | |
21 | UCSRB = (1<<TXEN)|(1<<RXEN); |
22 | //Transmitter und Receiver einschalten//
|
23 | |
24 | do
|
25 | {
|
26 | UDR = r; //'R' zu testzwecken versenden// |
27 | _delay_ms (1000);//Sekunde warten// |
28 | }
|
29 | while (1); |
30 | |
31 | return 0; |
32 | }
|
Was stimmt nicht? Gruß Nico @Ralf: Da muss ich mir erst ein Multimeter ausleihen...
also die Baud-Rate bekommst du nur mit nem Oszi raus. Alles andere lässt sich einfach finden. Probier mal am Hyperterm alle möglichen Einstellungen durch. Parity gerade, ungerade, aus; Stopbit 1 oder 2; hier mal ein Auszug aus meinem Car-PC Prog. UCSRA=0x00; UCSRB=0x18; // 8 data bit // UCSRB=0x1C; // 9 data bit // UCSRC=0xB6; // odd par UCSRC=0xA6; // even par // UCSRC=0x86; // no parity UBRRH=0x00; UBRRL=0x33; es läuft mit dem internen 8MHz Osz. beleg sie mal hart so, ohne Formeln usw... wenn die Einstellungen nicht gehen, wirds kompliziert... btw: Was ist es denn für ein Chip?
Im Hyperterm kann ein lokales Echo eingeschaltet werden. Eventuell liegt es daran? #
ERFOLG! ich habe den Fehler gefunden: Und zwar hatte ich das Board gekauft, das UART Beispiel von der Olimexseite geladen und entsprechend der dortigen Notiz losgelötet. Die ist aber falsch. Nur genau das war das letzte, was ich in Frage stellte. Also für alle die, die nach mir kommen: Beim UART oder USART Beispiel von OLIMEX für das P28 Board mit Atmega 8 dürft ihr nicht "Sample program for Olimex AVR-P28 with ATMega8 processor * Echoes back the received characters on the uart. In order to work, * connect the TX pad with PD1(pin 3) and RX pad with PD0(pin 2) * Compile with AVRStudio+WinAVR (gcc version 3.4.6)" befolgen. Stattdessen muss TX an PIN 2 und RX an PIN 3 des Atmega8! So, nun zur eigentlichen Arbeit...
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.