PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Prüfungstress, Usart geht nicht



SebZilla
06.06.2009, 20:08
Hallo ich brauche unbedingt Hilfe von euch.
Kurze Erklärung:
ich habe in 1 Woche Abschlussprüfung und ich bekomme den usart nicht hin.

Hardware:
STK200 board mit einem Atmega32 ext. 16MHz
RS232 mit Max232
SPI Schnittstelle zum proggen
Standart LCD an PORTB
Null ModemKabel (seldstgebaut, man weiß ja nie)

Software:
myAVR Workpad Plus demo mit WinAVR
integriertes Terminal & Win Hyperterminal

Literatur:
AVR Risc (Franzis PC & Elektronik)


Einstellungen:
anynchron, 8N1, senden & empfangen, kein Handshake


Erfolgreich getestet habe ich die direkte Verbindung zwischen 2 PCs,
sowie die Verbindung bis zum Sockel des Atmegas. (RX & TX auf Sockel gebrückt)

Nutze zum testen folgendes Programm


// INCLUDE
#include "inc/avr/io.h"
#include "inc/avr/rs232.h"

int main(void)
{

/* RS232 einschalten ... */
setup_uart();

/* Willkommensnachricht senden ... */
uart_putchar('a');

while (1)
{
}

return 0;
}

}

Mein Oszilloscope, direkt am µC, zeigt mir konstant -10V an sobald die main startet.

Bitte könnt ihr mir Helfen es geht echt um meinen Arsch und ich weiß einfach nicht mehr weiter.

Habe vor ca 6 Wochen das erste mal kontakt mit Atmegas aufgenommen.
Da mein Ausbilder keinen Plan davon hat bin ich ziemlich gekniffen.
Euerem und dem mikrocontroller.net Forum ist es zu verdanken das ich inzwischen weiß womit ich es zu
tun habe.
Aber das hier übersteigt inzwischen einfach meine Nerven.

Ich hoffe ihr könnt mit meinem Angaben was anfangen, ansonsten stelle ich auch die header datei noch zur
Verfügung stehlen, wegen der Funktionen.

THX schon mal im voraus.

uwegw
06.06.2009, 20:52
Nach ein paar kleinen Anpassungen bekomm ich ein wunderschönes 'a'. Allerdings gibt es noch ne warning:
uart.c: In function 'uart_getline':
uart.c:47: warning: comparison is always true due to limited range of data type
Dürfte an der -1 liegen. Das äußert sich dann darin, dass bei verwendung von uart_getline() das Programm abstürzt und neu startet. So geht es besser:


void uart_getline(char *buffer)
{
int c=0;
while ((char)c != 0x0D)
{
c = uart_getchar();
if ( (c != -1) && (c != 0x0D) && (c != 0x0A))
{
*buffer = (char)c;
buffer++;
// Achtung: Der Buffer muss groß genug
// sein, sonst kann es hier zu einem
// Überlauf kommen!!
}
}
// Wichtig: String abschließen!
*buffer = 0;
}


Dann noch ne Kleinigkeit:
In file included from test.c:5:
rs232.c:103: warning: function declaration isn't a prototype
Das ist void setup_uart(). In C muss (anders als in C++) im Kopf der Funktion in den Klammern ein void stehen, wenn keine Parameter übergeben werden.

Und noch was: deine rs232.h müsste eigentlich rs232.c heißen, weil dort die Funktionen komplett deklariert sind. Sie sollte außerdem nicht direkt inkludiert werden, sondern nur eine Headerdatei (die dann wirklich rs232.h heißen würde). Die rs232.c wird dann nur im makefile eingebunden. Das ist bei kleineren Programmen meist egal, aber wenn die c-Datei an mehreren Stellen inkludiert wird, gibt es Probleme.

SebZilla
07.06.2009, 08:42
Guten Morgen

THX @ uwegw
Habe das void eingefügt und auch die Funktion uart_getline entsprechend
geändert.

Leider kein "a"

Was mir nicht so ganz in den Kopf geht ist die Sache mit der HeaderDatei.

Also ich soll aus meiner jetztigen .h eine .c machen, soweit ist noch K.
Dann soll ich einer eigene .h Datei machen womit ich die .c dann include, ist eigentlich auch noch klar.

Aber was muss in dieser neuen .h Datei den drin stehn?????????

SRY leider gibt mein Geist langsam den Geist auf, versuche schon seit 2 Wochen diesen Bus zum Laufen zu bewegen. ](*,)

Hubert.G
07.06.2009, 09:00
IN der rs232.h werden die Funktionen der rs232.c deklariert.
Wo hast du die Prozessorfrequenz definiert?

SebZilla
07.06.2009, 09:22
Die F-CPU und co stehen in der rs232.h oben.

#define PROZESSORTAKT 16000000
#define UART_BAUDRATE 4800
#define UART_SETTING ((PROZESSORTAKT/(UART_BAUDRATE*16L)) - 1)

Das versteh ich gerade nicht so richtig die Funktionen sind doch schon deklariet in der jetztigen rs232.c Datei.

Ist vielleicht etwas viel verlangt aber könnte mir einer von euch diese header datei anfertigen, dann weiß ich wennigstens das die Fehlerfrei ist?????????

BITTE "lieb guck"

Hubert.G
07.06.2009, 12:28
Allein schon diese Zeile:
Mein Oszilloscope, direkt am µC, zeigt mir konstant -10V an sobald die main startet.
sagt mir das du keine Ahnung hast von dem was du tust.
Das ganze hast du irgendwo abgeschrieben oder kopiert ohne zu begreifen was sich da abspielt. Von C hast du auch keine Ahnung.
Das #include musst du eventuell noch ändern, ich arbeite mit dem AVR-Studio.
Wenn mit dem Anhang nichts kommt dann hast du noch einen Hardwarefehler.

Besserwessi
07.06.2009, 16:39
Der Prozessortakt sollten im Hauptprogramm definiert werden. So steht es auch im file rs232.???. Die Baudrate gehört eigentlich auch dahin.

Die Aufteilung in die .h und .c Files sollte man sich mal bei andernen programmen abschauen.

SebZilla
07.06.2009, 16:58
@ Hubert G.
1. Vielen Herzlichen Dank für die Dateien.
2. Danke für die Motivation, du hast das erfasst was ich euch im ersten Beitrag klar machen wollte.

Ich versuche das ja alles zu verstehen, es ist aber einfach zu viel in zu kurzer Zeit, für mich.

Habe aber keine Wahl, auch wenn ich eigentlich lieber vor Verzweifelung aufgeben würde.

Wenn jemand mag, würde ich das mit den Spannungwerten gerne Verstehen.
Ich gehe von folgendem aus.
Mein Startbit ist low, die Datenbits sowie das Stopbit sind high.
Low ist in diesem fall -10V und high +10V, richtig??????

Hubert.G
07.06.2009, 17:02
Du bist an der RS232-Schnittstelle und nicht am µC, der wäre bei diesen Werten schon lange tot.
Sollte das ganze immer noch nicht funktionieren, dann solltest du mal die Hardware überprüfen.

SebZilla
07.06.2009, 17:29
Habe bei dein Datein noch ein Prob:

main.o: In function `main':

main.c
(.text+0x8): Linkerfehler: undefinierte Sprungadresse: `setup_uart'
(.text+0xe): Linkerfehler: undefinierte Sprungadresse: `uart_putchar'

Hab mir aber schon alle Dateien angeguckt ist alles richtig geschrieben und finden tut er die dateien ja.

Hubert.G
07.06.2009, 17:41
Da findet der Linker die rs232.c nicht. Ich kenne WINAVR nicht, aber wahrscheinlich hast du ein makefile. Darin musst du die rs232.c eintragen.

uwegw
07.06.2009, 21:04
Hast du überhaupt schon mal deine Hardware, also Pegelwandler, Kabel, Schnittstelle am PC, überprüft? Da kann nämlich auch noch was schieflaufen, denn dein Code läuft bei mir ja. Gerade weil du schreibst, du hättest das Kabel selbstgebaut.
Also:
-> AVR aus dem Sockel entfernen
-> Im Sockel mit einem Draht RXD auf TXD brücken
-> Am PC ein Terminalprogramm aufmachen, ein paar Zeichen senden. Sie müssen genauso wieder reinkommen, und wenn du die Brücke aus dem Sockel entfernst, darf nichts mehr kommen.
Bitte Ergebnis posten!

SebZilla
08.06.2009, 09:15
Oh Freunde. ich habe ein 'a' oder g oder was ich will.

@ uwegw:
Wie du in meinem ersten Beitrag lesen kannst habe ich dies schon ausprobiert.
"ERFOLGREICH"

Habe mir gerade nen anderes STK200 ausm Schrank genommen und ausprobiert.

Man sollte es nicht glauben aber es geht.
KP was an dem anders ist, denn auch nach intensiver Prüfung und Diskussion mit meinem Ausbilder finde ich keine Unterschiede.

Auf jeden Fall Danke ich euch sehr für die große Hilfe,

SebZilla
09.06.2009, 18:51
Hey ich bin's schon wieder.

könnte mir einer von euch erklären wie ich genau die "uart_getchar()" Funktion nutzen kann.

mein gehacktes siet so aus

int main(void)

/* RS232 einschalten ... */
setup_uart();

/* Willkommensnachricht senden ... */
uart_putline("\x1b[1H");
uart_putstring("\r");
uart_putchar('E');

while (1)
{
c = uart_getchar();
uart_putstring("\n\n\r drueck g");
if(c=='g'){
uart_putstring("\n\n\rhallo");}
else
uart_putstring("\n\n\rtschuess");
{
return 0;
}}}

Entprellen oder so muss ich hier ja woll nicht, oder??????
hab es schon mit Zeitschleifen versucht um das ich halt mehr zeit habe für die eingabe, wars anscheinend auch nicht.

THX SebZilla

Hubert.G
09.06.2009, 19:02
Bekommst du überhaupt ein Zeichen?
Dein Kompiler wirft keinen Fehler oder Warnung aus?
c ist nicht deklariert.

SebZilla
09.06.2009, 19:21
Ja leider kann ich das hier zu hause kein ozi.

Mein compiler sagt alles i.O.!

Ah, "c" ist als unsigned char definiert.

uwegw
09.06.2009, 21:32
Wozu brauchst du immer noch nen Oszi?

uart_getchar() liefert aber keinen unsigned char, sondern einen int!!! Das hat folgenden Grund: so kann signalisiert werden, dass kein neues Zeichen empfangen wurde. Dann ist der Rückgabewert nämlich -1. Wenn man nun also auf ein Zeichen wartet, macht man folgendes: in einer Schleife ruft man immer wieder uart_getchar() auf, solange bis keine -1 mehr zurückkommt. Dann steht im gelesenen int das Zeichen, und man kann es in nen char casten und weiterverarbeiten.


int c;

while (1)
{
uart_putstring("\n\n\r drueck g");
do{
c = uart_getchar();
} while (c==-1);

if((char)c=='g'){
uart_putstring("\n\n\rhallo");}
else
uart_putstring("\n\n\rtschuess");
}

SebZilla
09.06.2009, 21:50
THx @uwegw

Werde das morgen aufer arbeit mal weiter verfolgen:

Habe inzwichen auch eine Eingabe hinbekommen, aber brauche das schon als char damit ich es mit den anderen vergleichen kann.

Wünsche noch einen schönen Abend.

uwegw
09.06.2009, 21:57
Habe inzwichen auch eine Eingabe hinbekommen, aber brauche das schon als char damit ich es mit den anderen vergleichen kann.

int tmp;
char c;

do{
tmp = uart_getchar();
} while (tmp==-1);
c=(char)tmp

SebZilla
10.06.2009, 10:38
Ist es eigentlich möglich mit einer der "uart funktionen" die ich verwende, direkt einer Variable auszugeben????

Momentant gebe ich die Zeit die eingelesen wird
über einer switch Anweisung aus

Beispiel:
iMin_einer = (hilf_1 + hilf_2 + hilf_4 + hilf_8);
switch("%c", iMin_einer)
{
case 0x00:
uart_putstring("0");
break;
case 0x01:
uart_putstring("1");
break;
case 0x02:
uart_putstring("2");
break;
case 0x03:
uart_putstring("3");
break;
case 0x04:
uart_putstring("4");
break;
case 0x05:
uart_putstring("5");
break;
case 0x06:
uart_putstring("6");
break;
case 0x07:
uart_putstring("7");
break;
case 0x08:
uart_putstring("8");
break;
case 0x09:
uart_putstring("9");
break;
default:
uart_putstring("default");
break;
}
funktionieren tut es ja aber besonder elegant ist das ja nicht.

uwegw
10.06.2009, 16:41
Du brauchst eine Funktion, die eine Zahl in einen string umwandelt. Den string kannst du dann mit uart_putstring() ausgeben.
Für eine int-Zahl ist es itoa(), für einen unsigned int ist es utoa(). Darüber mach dich mal in der avr-libc-Doku schlau!

SebZilla
14.06.2009, 08:06
Hallo ich bin's nochmal

Wollte nur mitteilen das ich es, gestern dann endlich geschafft habe das Prog. fertig zu stellen.

"Die Heizungssteuerung läuft absolut Fehlerfrei!!!!"

Ich möchten mich hier an dieser Stelle wirklich herzlich bei euch für die tatkräftige Hilfe bedanken.
Ich hätte es sicher sonst ich geschaft.

DANKE @ ALL

wenn einer von euch vielleicht Interesse an dem Prog. hat, kann ich das gerne nächste Woche hier zu Verfügung stellen.

Wünsche euch noch ein schönes WE und man liest sich sicher mal wieder.