Forum: Mikrocontroller und Digitale Elektronik UART und Hyperterminal Problem


von Nicolas U. (Firma: TU Berlin) (nico1984)


Lesenswert?

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

von Daniel (Gast)


Lesenswert?

> 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

von B e r n d W. (smiley46)


Lesenswert?

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

von Ralf S. (schepperle)


Lesenswert?

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!

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> 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.

von Nicolas U. (Firma: TU Berlin) (nico1984)


Lesenswert?

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...

von David (Gast)


Lesenswert?

Verwende ein Bautratenquarz und du hast keine Probleme mehr...

von Ralf S. (schepperle)


Lesenswert?

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?

von Tilo (Gast)


Lesenswert?

Im Hyperterm kann ein lokales Echo eingeschaltet werden. Eventuell liegt 
es daran?
#

von Nicolas U. (Firma: TU Berlin) (nico1984)


Lesenswert?

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
Noch kein Account? Hier anmelden.