Forum: Mikrocontroller und Digitale Elektronik Usart atmega8515 finde fehler nicht


von focus (Gast)


Angehängte Dateien:

Lesenswert?

Hi, bin Anfänger in Cachen c unter µC und habe mich mal an den IAR c
Kompiler herangewagt. Nun stehe ich jedoch vor einem Problem und weiss
nicht so recht weiter. Nach meinem Verständnis müsste das Programm
ständig die Werte aus received auf das usart ausgeben. Wenn ein neues
Zeichen über die Schnittstelle eintrifft wird dies in received
gespeichert und von nun an geschickt.
Kann mir jemand sagen ob ich etwas falsch mache? Im Netz findet sich
leider auchnicht allzuviel zum Thema AVR und IAR, oder zumindest finde
ich es nicht ;-)

Vielen Dank Michael

von Jörg Wunsch (Gast)


Lesenswert?

Erstens: falsches Forum.  Das hier ist das GCC-Forum, da wirst Du kaum
die Experten für den IAR finden.

Zweitens: Du solltest Deinen Fehler vielleicht beschreiben.
Kristallkugeln sind Mangelware heutzutage, oder woher sollen wir denn
sonst erfahren, was da genau passiert bei Dir?

Drittens: um off-topic zu werden :), beim GCC müßtest Du `received'
als `volatile' deklarieren um zu verhindern, daß der Compiler den
(für
ihn nicht erkennbaren) Zugriff aus der Interruptroutine heraus
wegoptimiert.  Vielleicht ist das ja bei IAR ähnlich?

von focus (Gast)


Lesenswert?

hmm ja das mit dem falschen forum ist peinlich =)
zum aussehen gibt es eigentlich nicht viel zu sagen.. es kommen die
ganze zeit komische daten, zwar immer die gleichen aber nicht die
erwarteten, an (a mit dächelchen) und die ändern sich auch nach einer
eingabe von der pcseite aus nicht... könnte schon ein von dir
beschriebenes problem sein.. . das mit dem volatile werde ich morgen
ausprobieren muss mir einen neuen controller besorgen. momentan lässt
sich das stk500 irgendwie nicht ansprechen (aus dem atmel assembler)
frag mich aber bitte nicht warum g heute geht echt alles daneben

von Jörg Wunsch (Gast)


Lesenswert?

Das falsche Zeichen könnte auch auf Paritätsprobleme hindeuten, oder
aber falsche Baudrate.  Letzteres kann Dir bei den ATmegas schnell
passieren, wenn Du einen externen Quarz dranbammelst, Deine
Baudratenberechnung darauf einrichtest -- und dann vergißt, den
RC-Oszillator per Fusebit außer Betrieb zu nehmen.

von Marco -. (Gast)


Lesenswert?

Hallo
um nicht noch einen neune Beitrag zu erstellen, stelle ich mein Problem 
hier dazu. Ich hab ein Programm, welches ein Zeichen empfängt und es 
wieder zurücksendet. Dieses Programm läuft auch auf einem anderen µC nur 
bei mir leider nicht. Ich nutze das STK500 und den ATmega8515.

1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <stdint.h>
4
#include <stdlib.h>
5
#include <inttypes.h>
6
7
8
void USART_Init(uint8_t baud );
9
void USART_Transmit(uint8_t data);
10
unsigned char USART_Receive( void );
11
12
13
14
int main(void){
15
16
  cli();
17
  USART_Init(12);
18
  sei();  
19
20
  while(1){
21
  USART_Transmit(USART_Receive( ));
22
  }
23
24
  return 0;
25
}
26
27
void USART_Init(uint8_t baud )
28
{
29
  UBRRH = (unsigned char)(baud>>8);          /* define baudrate */
30
  UBRRL = (unsigned char)baud;
31
  UCSRB = (1<<RXEN)|(1<<TXEN);            /* Transmit and Receive */
32
  UCSRB |= (1<<RXCIE);                /* Receive Interrupt enable */
33
  UCSRC = (1<<URSEL)|(3<<UCSZ0);            /* 8bit Mode /1 stop bit */
34
}
35
36
void USART_Transmit(uint8_t data)
37
{
38
  while ( !( UCSRA & (1<<UDRE)) )            /* wait, till buffer is empty */
39
    ;
40
  UDR = data;  
41
}                  /* write data into buffer */
42
43
unsigned char USART_Receive( void )
44
{
45
  /* Wait for data to be received */
46
  while ( !(UCSRA & (1<<RXC)) )
47
  ;
48
  /* Get and return received data from buffer */
49
  return UDR;
50
}

Ich nutze den internen Takt von 4 MHz, der richtige Controller ist auch 
ausgewählt, RS232 Spare ist mit Port D verbunden, Fusebit SUT_CKSEL 
steht auch auf 4 MHz aber leider funktioniert nichts. Ich habe mir auch 
schon verschiedene Beiträge hier durchgelesen, habe verschieden 
Programme von der Atmelseite probiert aber es bringt nichts. Hat einer 
eine Idee??
Danke im Voraus!

von holger (Gast)


Lesenswert?

Klassiker: Interrupt aktiviert ohne Interruptroutine

  UCSRB |= (1<<RXCIE);                /* Receive Interrupt enable */

>Ich nutze den internen Takt von 4 MHz

Für serielle Übertragung? Vergiss es. Kauf dir nen Quarz.

von Marco -. (Gast)


Lesenswert?

Dieses Programm ist nur ein Teil von einem anderen und deshalb sind sie 
aktiviert. Ich habe jetzt den Takt auf 1 MHz verringert aber es 
funktioniert immer noch nichts.

von Michael U. (amiga)


Lesenswert?

Hallo,

Marco G. schrieb:
> bei mir leider nicht. Ich nutze das STK500 und den ATmega8515.
Schön für Dich. ;-)

> Ich nutze den internen Takt von 4 MHz, der richtige Controller ist auch
> ausgewählt, RS232 Spare ist mit Port D verbunden, Fusebit SUT_CKSEL
> steht auch auf 4 MHz aber leider funktioniert nichts. Ich habe mir auch
> schon verschiedene Beiträge hier durchgelesen, habe verschieden
> Programme von der Atmelseite probiert aber es bringt nichts. Hat einer
> eine Idee??

Zum Takt wurde schon was gesagt.

"Es funktioniert nichts" ist eine so typische Fehlerbeschreibung, daß Du 
vermutlich wenig Hilfe bekommen wirst...

Geht das Echo im Terminalprogramm, wenn Du RxD mit TxD an RS232-Spare 
direkt brückst (Verbindung zum Port natürlich abziehen).

Wenn nicht -> serielles Kabel und Terminalprogramm in Ordnung bringen.

Geht das Echo wenn Du den Prozessor draußen hast und RxD mit TxD direkt 
an der AVR-Fassung brückst?

Wenn nicht -> Verbindungen zwischen RS232-Spare und Port falsch.

Kommen Zeichen im Terminal an, wenn Du nur endlos ein Zeichen vom AVR 
sendest?

Gruß aus Berlin
Michael

von holger (Gast)


Lesenswert?

>Dieses Programm ist nur ein Teil von einem anderen und deshalb sind sie
>aktiviert.

Warum fragst du dann hier eigentlich? Sollen wir jetzt raten
wie dein Prgramm aussieht?

>Ich habe jetzt den Takt auf 1 MHz verringert aber es
>funktioniert immer noch nichts.

Klar, ändere deine Taktfrequenz wie es dir in den Sinn kommt.
Ist ja auch scheissegal welchen Wert UBRR hat.

von Michael U. (amiga)


Lesenswert?

Hallo,

holger, sieh es nicht so eng, Glaskugeltraining muß auch sein und 
Stochern im Nebel ist doch für den Poster offenbar ausreichend.

Mich würde z.B. auch interessieren, wo der freigegebene 
Receive-Interrupt seiner Meinung nach hinspringen soll so ohne 
Interrupt-Routine.

Ist sicher nicht das einige chaotische...

Gruß aus Berlin
Michael

von Marco -. (Gast)


Lesenswert?

Tut mir ja leid, dass ich kein Profi bin und ich sehe ein, dass mein 
Beitrag ohne die richtigen Infos war aber man kann es einem auch anders 
sagen.

von holger (Gast)


Lesenswert?

>Tut mir ja leid, dass ich kein Profi bin und ich sehe ein, dass mein
>Beitrag ohne die richtigen Infos war aber man kann es einem auch anders
>sagen.

Wie denn bitteschön?

Die Antwort für Weicheier?

Lieber Marco, wenn du dir mal die Mühe machen
würdest das Datenblatt zu deinem uC zu lesen, dann würdest
du evtl. verstehen wie er funktioniert.  Falls du nicht
verstehst wie er funktioniert dann wirf bitte ein paar
Wattebällchen in meine Richtung. Wenn du mich an der Nase
triffst, dann hast du einen Wunsch frei ;)

Wüüürg!

von Michael U. (amiga)


Lesenswert?

Hallo,

Marco G. schrieb:
> Tut mir ja leid, dass ich kein Profi bin und ich sehe ein, dass mein
> Beitrag ohne die richtigen Infos war aber man kann es einem auch anders
> sagen.

Kann man, richtig. Ich kann aber damit leben, wenn man meine Antworten 
nicht mag.

Hast Du denn versucht, das Problem etwas einzugrenzen?
Meine Hinweise da waren durchaus ernst gemeint, die könnten uns beiden 
weiter helfen.

Gruß aus Berlin
Michael

von Marco -. (Gast)


Lesenswert?

Ich bin gerade dabei deine Punkte abzuarbeiten.
Mir gings ja nicht darum, dass ihr mein Problem löst sondern darum, ob 
mein Programm so funktioniert. Anscheinend liegts ja an den 
Einstellungen und/oder am Hyperterminal und darüm kümmere ich mich nun. 
Danke für deine Tipps

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.