PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : großes problem bei seriellen übertragung!!



katiiiiii
25.02.2005, 09:15
hallo leute!

Ich habe ein großes problem bei der programmierung der seriellen übertragung auf den pc. ich verwende einen atmega32 und als programmiersoftware CodeVisionAVR.
überall im internet bzw. datenblatt finde ich folgendes programm:

void USART_Transmit( )
{
while ( !( UCSRA & (1<<UDRE)) );
UDR = '3';
}

Das problem dabei ist,dass es bei mir nicht funktioniert. Ich kann das UDRE bit so nicht ansprechen. Es ist das fünfte bit im register UCSRA. Bei mir im CodeVision muss ich das bit mit UCSRA.5 ansprechen. Aber auch so funktioniert das nicht.
Vl habt ihr eine Idee wie ich das lösen kann.

ich hab mich damit sehr viel beschäftigt.
und hab es auch so probiert:

void USART_Transmit()
{
while (!(UCSRA & 0x20));
UDR = '3';
}

aber auch so hats nicht geklappt!

wär cool,wenn ihr mit helfen könntet.

glg kati

katiiiiii
25.02.2005, 10:04
also i hab jetzt das programm ausgebessert. und des schaut jetzt so aus:

void USART_Transmit1()
{
while ( !( UCSRA & (1<<UCSRA.5)) );
UDR = 3;

}

aber er geht aus der while schleife net raus. Habs im avrstudio simuliert und bin dabei drauf gekommen.

gesetzt sand mein sachen richtig, zumindest brauch ich sie so...
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: Off
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud rate: 9600
UCSRA=0x00;
UCSRB=0x08;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x33;

i bin so ratlos und net mal meine lehrer können sich dabei aus :-/

glg

Arexx-Henk
26.02.2005, 15:45
Hallo katiiiiii

Ich finde so mahl kein Fehler in deinem Code.

Nicht aus Schleife: while ( !( UCSRA & (1<<UDRE)) );
kommen scheint mir als ob die Transmitter (UCSRB TXEN) irgendwo nicht eingeschaltet ist.

Poste mahl dein Code


Gruss

Henk

katiiiiii
26.02.2005, 17:20
Das Problem ist ja, dass i UDRE net einfach so ansprechen kann. UDRE ist ein bit aus dem register UCSRA. i muss des, aber so ansprechen UCSRA.5. weil es das fünfte bit im register ist..

mein code ist hier angehängt...
danke

Arexx-Henk
26.02.2005, 19:42
Hallo katiiiiii

Dein code lauft bei mir ohne Problehmen in ein Atema8L (in ein ASURO Roboter) 2400 baud (UBRRL=0xCF stat 0x33).

Vielleicht sollte

1.
void USART_Transmit()
geanderd werden in
void USART_Transmit(void)
2.
void main(void)
in
int main(void)
3.
return 0;
als letzte im main()
4.
UDRE statt UCSRA.5
5.
ein prototype von USART_Transmit() zugefugt werden.

Probier mahl dieses Program (ohne etwas zu zufugen)





#include <mega32.h>

//function prototype declaration
void USART_Transmit(void);

void USART_Transmit(void)
{
while ( !( UCSRA & (1<<UDRE)) );
UDR = 3;
}


int main(void)
{
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: Off
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud rate: 9600
UCSRA=0x00;
UCSRB=0x08;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x33;


while (1)
{


USART_Transmit();

};

return 0;

}


bin gespannt

Gruss

Henk

katiiiiii
26.02.2005, 23:19
hi!
hi!

leider erkennt er schon beim compilieren das UDRE nicht. ich kann das bit so nicht ansprechen. es kommt die fehlermeldung "undefinded symbol". ich hab herausgefunden, dass es nur mit UCSRA.5 geht. da hab i zumindest keine fehlermeldung mehr, aber es geht halt trotzdem net ;-/

mfg
kati

Arexx-Henk
26.02.2005, 23:41
Hallo Kati,

wenigstens

while ( !( UCSRA & (1<<0x20)) );

sollte auch gehen,

oder vielleicht ist dein Atmega32 kaput? (Snif..)

oder wie Kontrolierst du dass 'es nicht geht'?
Wie weisst du dass das Program hangen bleibt?
Vielleicht liegt das Problehm irgend anderswo.

Gruss

Henk

katiiiiii
27.02.2005, 11:36
hi!

i glaub net das der atmega32 kaputt ist. wir haben erst einen neuen kaufen müssen, weil wir fusebits gesetzt haben.
naja, durch das AVRStudio kann i mei Programm simulieren und schaun, obs geht. i mein i bin mir net sicher, ob des so stimmt wie i des mach. aber mei lehrer hat mir des zeigt.

aber i werd deinen vorschlag später no ausprobieren.
danke!

mfg
kati

katiiiiii
01.03.2005, 07:49
hi!

leider geht die übertragung so a net :-(

mfg
kati

muraad
01.03.2005, 10:07
Kati include mal die io.h auch noch. Besonders seit dem neuen WinAVR hat ich ohne die einige Probleme. Vielleicht ists ja beim CodeVision auch deswegen. Ist mir nur aufgefallen weil bei beiden Codes von euch die io.h nich included war.
Gruß Muraad

EDIT:
Mir ist es grad aufgefallen du hast nach der while() anweisung die {} Klammern vergessen also:


void USART_transmit (unsigned char c) {
while (!(UCSRA & (1<<UCSRA.5))) {} <--- Die Klammern da
UDR = c;
}

Deswegen bleibt er auch da auch hängen denk ich.

Arexx-Henk
01.03.2005, 18:47
Hallo kati und muraad,

vielleicht ist muraad's antwort die losung.

kati, kannst du mahl die compilierten list file (.lst) hier posten?

Da kann ich vielleicht nachschauen wo die fehler entsteht.

gruss

Henk

katiiiiii
02.03.2005, 07:48
hi!

i werd dann später noch schaun, ob des andere funktioniert. bin jetzt leider in der schule!

mfg

katiiiiii
03.03.2005, 08:43
hi!
leider geht bei mir gar kein beispiel von euch! habs zwar wieder nur im Simulator simulieren können,weil mein schulkollege net da war und der unser board mitgenommen hat....
Ich weiß einfach nicht mehr weiter, wie ich des am besten lösen könnt :-(

mfg
kati

katiiiiii
03.03.2005, 08:59
aja, hätt noch eine Frage...
wird das UDRE bit von selber wieder auf 1 gestetzt oder muss man des übers programmieren machen?

katiiiiii
03.03.2005, 14:08
so, das programm funktioniert...
endlich...nach langem herumprobieren funktioniert mein programm so irgendwie.
danke an alle, die mir vorschläge gemacht haben

while (!(USCRA.5);
UDR=0x15; --> ist die Lösung

mehr brauch ich nicht. habs mitn oszi ausgemessen und er sendet alle 1,1ms 0x15 hex.
jetzt würd i nur gern wissen, wie ich das am besten programmieren kann, dass er nur jede sekunde ein Signal sendet. wär ganz super!

mfg Katrin

bluebrother
03.03.2005, 14:54
am einfachsten mit einer Verzögerungsfunktion die immer genau eine Sekunde wartet -- das kannst du mit einem Hardware-Timer relativ einfach machen. Einfach auf einen Überlauf warten.
Alternative wäre ein zählen von ner Variable.

katiiiiii
03.03.2005, 16:02
und wie schaut des dann im pogramm aus? gibts da vl a paar beispiele? weil irgendwie hab i so ka idee wie ich das am besten lösen kann. bin noch ein anfänger in diesem gebiet.

danke!

mfg kati

muraad
03.03.2005, 19:29
Auf www.mc-project.de unter Timer geht es in der mit um das erzeugen 1 Sekunde, es ist auch ein Codebeispiel dabei. Vor allem ist aber erklärt wie man es berechnen kann.
Gruß Muraad

EDIT:
AH jetzt versteh ich des mit dem USCRA.5
Des heisst ja schon Bit 5 im Register USCRA. So wie wir es hatten würde es ja Bit 5 im Register USCRA im Register USCRA heissen.

Arexx-Henk
03.03.2005, 19:48
Hallo Kati,

kannst du auch mahl die .hex datei schicken?

gruss

Henk

Arexx-Henk
03.03.2005, 20:32
Hallo Kati


so, das programm funktioniert...

also profiziat

hatte's nicht gelesen,

brauch dein hex nicht mehr

gruss

Henk