PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : STK500, Atmega16, UART, AVR Studio4



Jimmy83
08.04.2010, 10:11
Hallo allerseits,


ich versuche verzweifelt eine Verbindung von meinem Board zu meinem PC herzustellen. Hab in dem Datenblatt vom stk500 gesehen, dass PD0 &1 mit RXD und TXD ueber ein Kabel verbunden werden. Hab ich auch gemacht. Hab dann aus den Tutorials Die Texte rauskopiert und ein Programm auf mein Board geladen.
Und wo wird jetzt die Variable X angezeigt ? Benötige ich da noch software ?

Hier mein Programm:

#include <avr/io.h>
#include <inttypes.h>


#ifndef F_CPU
#warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 4000000"
#define F_CPU 4000000UL // Systemtakt in Hz - Definition als unsigned long beachten
// Ohne ergeben sich unten Fehler in der Berechnung
#endif

#define BAUD 9600UL // Baudrate

// Berechnungen
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1) // clever runden
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1))) // Reale Baudrate
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.

#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
#error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch!
#endif


/* UART-Init Bsp. ATmega16 */

void uart_init(void)
{
UCSRB |= (1<<TXEN); // UART TX einschalten
UCSRC |= (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); // Asynchron 8N1

UBRRH = UBRR_VAL >> 8;
UBRRL = UBRR_VAL & 0xFF;
}

int main(void) {

uart_init();

while (!(UCSRA & (1<<UDRE))) /* warten bis Senden moeglich */
{
}

UDR = 'x'; /* schreibt das Zeichen x auf die Schnittstelle */
}


Vielen Dank und viele Gruesse,

Jimmy

Jimmy83
08.04.2010, 10:18
Der Smiley ist natuerlich 8 )

Hubert.G
08.04.2010, 12:01
Am PC brauchst du noch ein Terminalprogramm, im Windows Hyperterminal.
Dort auch 9800 8n1 einstellen, kein Hardwarefluss.
Es könnte dann noch RX und TX verdreht sein.

Jimmy83
08.04.2010, 12:12
Hab das Programm HTerm installiert und jetzt ? Stimmt obiges Programm zum Ausgeben von X? Und wo soll X dann angezeigt werden !? Muss ich mit PORTD nicht noch irgendwas zuweisen ?hab ja da nur die Verbingung zu RDX und TDX

Hubert.G
08.04.2010, 14:40
Wenn du im Hterm die nötigen Einstellungen gemacht hast, solltest du schon was sehen.
PortD musst du nichts zuweisen.
Du kannst aber probieren ob in der Leitung alles richtig ist.
Wenn du den Stecker der auf PortD geht abziehst und eine Brücke hinein steckst, dann solltest du eine Eingabe am HTerm als Echo zurückbekommen.

Jimmy83
08.04.2010, 14:50
mhhh also jetzt kommt was an lauter rechtecke und den wert 255...ich nehm an wegen der while schleife...aber wie krieg ich da ein x hin :-)

Jimmy83
08.04.2010, 14:53
also was da komisch ist, wenn ich in Hterm die Baudrate veränder, wird mir immer ein anderes Zeichen gesendet !? Woran liegt das und wie sende ich dann genau und immer mein x?

Viele Gruesse und vielen Dank,

Jimmy

Hubert.G
08.04.2010, 17:11
Wenn du mit dem internen Oszillator arbeitest kann es sein das dessen Frequenz nicht genau genug ist. Dann musst du einen Quarz nehmen.
Im HTerm musst du 9800 8n1 einstellen, kein Hardwarefluss oder Handshake.

Jimmy83
08.04.2010, 17:21
also bei HTErm hab ich die Einstellungen so vorgenommen und da wird mir kein x angezeigt. Wenn ich die Baudrate auf 38400 erhöhe werden plötzlich x angezeigt !? Woran liegt denn das ?

Hubert.G
08.04.2010, 22:14
Das ist schwierig festzustellen. Probier mal ein Wort auszugeben.
Möglich wäre das dein Takt nicht stimmt und du tatsächlich vier mal so schnell bist.

Jimmy83
09.04.2010, 09:15
mhh also ich hab jetzt versucht nen anderen Buchstaben bei der gleichen Baudrate auszugeben und da kam wieder was anderes raus...wenn ich ganz oft hintereinander connect und disconnect druecke kommt irgendwann genau das raus was ich mir anzeigen will!?Druecke ich dann wieder disconnect-connect kommt wieder was anderes raus. Wo kann ich denn da was einstellen dass mir immer mein x angezeigt wird !?

MFG

Hubert.G
09.04.2010, 09:34
Wenn immer was anderes herauskommt, dann stimmt die Taktfrequenz nicht ganz.
Nimm den Takt vom STK oder verwende einen Quarz, am besten mit Baudratenfrequenz.

Jimmy83
09.04.2010, 11:08
Wie krieg ich die denn raus ? Im datenblatt hab ich geschaut und da steht 3,68 MHz. Habs im Programm korrigiert..aber jetzt gibt er immernoch falsche Zeichen aus!?

MFG und vielen Dank

Hubert.G
09.04.2010, 12:03
Du musst am STK noch die entsprechende Brücke stecken und in den Fuses auf entweder ext. Clock oder auf ext. Quarz umstellen.

Jimmy83
09.04.2010, 12:13
Muss ich dann XTAL1 mit was verbinden !? Und was heisst es dieses zu setzen!? Ist da im Programm gemeint!? Werd irgendwie nicht schlau aus dem Datenblatt !?

MFG

Hubert.G
09.04.2010, 12:35
Brücke XTAL1 muss gesteckt sein und OSCSEL auf 1-2 Dann ist der interne 3,64MHz Clock aktiv.

Jimmy83
09.04.2010, 12:38
aha :-) Habs grad gesehen...aber die sind beide gesteckt!?

Hubert.G
09.04.2010, 12:41
Dann musst du in den Fuses noch den internen Oszillator abschalten.

Jimmy83
09.04.2010, 12:50
Und wie mach ich das :-)

Hubert.G
09.04.2010, 12:57
Ich nehme an du verwendest das AVR-Studio.
Dort gibt es im Programmierfenster den Reiter Fuses
IN diesem Fenster stellst du unter SUT_CKSEL Ext..Cristal/Resonator Medium Frequ. , StartupTime ist egal, ein.

Jimmy83
09.04.2010, 13:27
#include <avr/io.h>

#ifndef F_CPU
#warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 4000000"
#define F_CPU 4000000 // Systemtakt in Hz - Definition als unsigned long beachten
#endif

#define BAUD 9600L // Baudrate, das L am Ende ist wichtig, NICHT UL verwenden!

// Berechnungen
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1) // clever runden
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1))) // Reale Baudrate
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD-1000) // Fehler in Promille

#if ((BAUD_ERROR>10) || (BAUD_ERROR<-10))
#error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch!
#endif

int main(void)
{
UCSRB |= (1<<TXEN); // UART TX einschalten
UCSRC |= (1<<URSEL)|(3<<UCSZ0); // Asynchron 8N1

UBRRH = UBRR_VAL >> 8;
UBRRL = UBRR_VAL & 0xFF;
while( 1 ) {
while (!(UCSRA & (1<<UDRE))) /* warten bis Senden moeglich */
{
}

UDR = 'm';
}
}


also die genannten Einstellungen hab ich gemacht...und er sendet immernoch so ein zeugs da ...was anderes kann es nicht sein !?

Jimmy83
09.04.2010, 14:01
Und jetzt gibt er mir bei den Fuses ne Fehlermeldung raus:


A problem occured when executing the command. SPIEN hat ein rotes Fragezeichen!? Kann also nicht mehr Programme aufspielen !? Was is denn da los ?

Hubert.G
09.04.2010, 14:12
Dann bringst du keinen Takt auf XTAL1
SPIEN kann ich gar nicht abschalten.

Hubert.G
09.04.2010, 14:27
Mit 3<<UCSZ0 hast du 2 Stopbit

Hubert.G
09.04.2010, 14:54
#define UBRR_VAL (((F_CPU)/(BAUD*16))-1) // clever runden
UDR = 'A';
_delay_ms(5);
Das habe ich geändert und hinzugefügt, bei mir läuft es.

Jimmy83
09.04.2010, 16:28
Dieses Problem hab ich mittlerweile behoben...aber er gibt mir immernoch falsche Buchstaben aus!? Weiss so langsam nicht mehr weiter...also programmierbar ist er wieder :-)

MFG

Hubert.G
09.04.2010, 17:02
Am Anfang des Programms gehört noch #include <util/delay.h>

Jimmy83
09.04.2010, 17:26
mhhh wuerde es dir was ausmachen deinen Quellcode hier reinzustellen? Irgendwie läuft grad nix mehr so richtig bei mir :-(

Vielen Dank fuer deine Muehe!!!

Hubert.G
09.04.2010, 17:36
#include <avr/io.h>
#include <util/delay.h>

#ifndef F_CPU
#warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 4000000"
#define F_CPU 3686400 // Systemtakt in Hz - Definition als unsigned long beachten
#endif

#define BAUD 9600UL // Baudrate, das L am Ende ist wichtig, NICHT UL verwenden!

// Berechnungen
#define UBRR_VAL (((F_CPU)/(BAUD*16))-1) // clever runden
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1))) // Reale Baudrate
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD-1000) // Fehler in Promille

//#if ((BAUD_ERROR>10) || (BAUD_ERROR<=10))
//#error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch!
//#endif

int main(void)
{
UCSRB |= (1<<TXEN); // UART TX einschalten
UCSRC |= (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1); // Asynchron 8N1
UBRRH = UBRR_VAL >> 8;
UBRRL = UBRR_VAL & 0xFF;
while( 1 ) {
while (!(UCSRA & (1<<UDRE))) /* warten bis Senden moeglich */
{
}

UDR = 'A';
_delay_ms(5);
}
}
Das läuft bei mir einwandfrei.
Ich verwende normalerweise die uart-Lib von Fleury, da braucht man sich um nichts kümmern.

Jimmy83
09.04.2010, 19:48
Hey,
vielen Dank fuer deinen Code...werd ihn am Montag direkt ausprobieren !!!
wünsch dir ein schönes Wochenende!

MFG

Jimmy83
12.04.2010, 07:58
Hey,

vielen Dank nochmal fuer deinen Code. Das Programm läuft und wenn ich die Buchstaben veränder kommt auch immer der richtige raus. Leider aber erst bei einer Baudrate von 38400. Woran könnte denn das liegen !? Oder hast du auch so eine hohe Baudrate eingestellt?
MFG

Hubert.G
12.04.2010, 11:57
Das ist etwas eigenartig, ich habe 9600 eingestellt.
Kann mir jetzt auf die schnelle nicht vorstellen woran das liegen könnte.
Wenn ich 38400 einstelle kommt Müll.
Probier mal einen Quarz aus, vielleicht passt der interne Takt nicht.
Schreib dir ein Programm das einen Sekundentakt ausgibt und lass eine Led blinken.

Jimmy83
12.04.2010, 16:31
mhh also ich versuchs morgen mal weiter...nen quarz hab ich keinen...die LEDs funktionieren im sekundentakt. Hat die Baudrateneinstellung was damit zu tun, wenn ich z.b. ne Stoppuhr programmieren will und nach gewissen Abständen die Zeit ausgeben möchte!? Das duerfte doch eigentlich keinen Einfluss darauf haben. Oder ?

MFG

Hubert.G
12.04.2010, 17:01
Der UART funktioniert eigenständig, verzögern kannst du nur den Ausgabezeitpunkt eines Buchstaben, aber nicht die Geschwindigkeit der Ausgabe.
Vielleicht liegt es auch am Terminalprogramm oder den Einstellungen darin.

Jimmy83
13.04.2010, 22:53
Mhh also ich werds morgen mal mit nem anderen Terminalprogramm versuchen !? Vielleicht liegts ja wirklich daran...weiß nämlich ehrlich gesagt nicht was ich im Terminalprogramm noch ändern kann!? "huihui" konnt ich auch ausgeben...aber halt wieder nur mit 38400 baud....kannst du denn ein Programm empfehlen ?

MFG

Hubert.G
14.04.2010, 08:38
Ich arbeite mit UTF-8Tera-Term, das Windows HyperTerminal funktioniert aber genau so gut.