Forum: Compiler & IDEs Mal ne dumme Frage.


von EAGLE (Gast)


Lesenswert?

Hallo,

ich benutze aktuell den Atmega 644 und bin in C gleich einmal daran 
gescheitert die Signale an Port A auszugeben.
Setze ich nämlich mit
1
 PORTA=255
 leuchten alle LEDs wies sein soll, blöd ist nur ich krieg sie nichtmehr 
aus. Jede direkte Zuweisung scheint final zu sein. Das einzigste was 
funktioniert ist die Zuweisung über ein ExOr nur das setzt voraus das 
ich davor alle LEDs nochmal auf 0 gesetzt habe, ist also nicht wirklich 
praktikabel. Was mach ich falsch??

Hier der code benutze die UART bib von peter fleury läuft 1a:
1
 
2
#include <avr/io.h>
3
#include <util/delay.h> // für _delay_ms(zeit);
4
#include <stdlib.h>
5
#include <avr/interrupt.h>
6
#include <avr/signal.h>
7
#include <avr/pgmspace.h>
8
9
#include "uart.h"
10
11
#define UART_BAUD_RATE 57600
12
13
int main(void)
14
{
15
  uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) );
16
  sei();
17
18
        DDRA = 0xFF;
19
20
21
        unsigned int empfangen=0;
22
23
  while(1==1){
24
25
26
    empfangen=uart_getc();
27
28
29
    if(empfangen==1){
30
                  PORTA = 0b00000001;
31
    }
32
    if(empfangen==2){
33
                  PORTA =  0b00000010;
34
    }
35
    if(empfangen==3){
36
                  PORTA = 0b00000100;
37
    }
38
    if(empfangen==4){
39
                  PORTA = 0b00001000;
40
    }
41
    if(empfangen==5){
42
                  PORTA = 0;
43
    }
44
45
46
  }
47
48
}

von Peter (Gast)


Lesenswert?

sendest du denn eine 5 oder eine '5'?

von Floh (Gast)


Lesenswert?

EAGLE schrieb:
> if(empfangen==1){
>                   PORTA = 0b00000001;

Was schickst du dem uC?
Sicher dass du in die Zweige der Abfragen reinkommst?
Weil das Ascii-Zeichen '1' ist nicht das selbe wie 1.
:-)

von Stefan B. (stefan) Benutzerseite


Lesenswert?

> empfangen=uart_getc();
> if(empfangen==1){

Sendest du den Dezimalwert 1 oder die Ziffer 1 (Dezimalwert 49)?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Was liefert uart_getc? Doch sicherlich das von Dir über die serielle 
Schnittstelle an den µC gesendete Zeichen.

Wenn Du das aber auswerten willst, dann musst Du dessen ASCII-Code 
oder eben das Zeichen auswerten.

Du aber vergleichst dieses Zeichen mit den numerischen Werten 1 bis 5 
- das sind die ASCII-Codes von Steuerzeichen, die Du im Terminalprogramm 
nur umständlich durch Drücken von CTRL+A bis CTRL+E eingeben kannst.

Ändere das und vergleiche empfangen mit den Konstanten '1' bis '5'. 
Das sind Zeichen.

von Karl H. (kbuchegg)


Lesenswert?

EAGLE schrieb:

> Setze ich nämlich mit
1
 PORTA=255
 leuchten alle LEDs wies sein
> soll, blöd ist nur ich krieg sie nichtmehr aus. Jede direkte Zuweisung
> scheint final zu sein.

Un dfür die Zukunft:
Beim Testen testet man immer die einfachste Variante.
In deinem Code fallen mir auf Anhieb 3 andere Dinge ein, die genausogut 
schief gehen können und die absolut nichts mit den Ports an sich, und 
dass eine Zuweisung 'final' wäre, zu tun haben.

Wie willst du unterscheiden, welcher dieser mindestens 3 möglichen 
Fehler vorliegt, wenn du nicht systematisch vorgehst?

von EAGLE (Gast)


Lesenswert?

Also danke erstma für die schnellen Antworten.
Ich sende sicher ein zahl (0-255) da ich das Programm zum senden selber 
geschrieben hab (java) und es mit dem Atmega 322 auch funktioniert.

von EAGLE (Gast)


Lesenswert?

@Karl heinz Buchegger

ja ich habs auch schon simpler gemacht:
1
while(1==1){
2
3
    empfangen=uart_getc();
4
5
     PORTA = empfangen;
6
7
}

mit dem Ergebnis das der erste genommene wert (also 0) final an die 
Ports ausgegeben wird.

d.h hier würden LEDs beispielsweise ewig leuchten:
1
    PORTA=255;
2
3
while(1==1){
4
5
    PORTA=0;
6
7
}

von M. B. (manubaum) Benutzerseite


Lesenswert?

while(1==1) is unnötig. while(1) reicht, da ja 1 schon boolean "true" 
entspricht.

von Felix (Gast)


Lesenswert?

Du schreibst, die Leds "würden" ewig leuchten in deinem letzten 
Beispiel. Heißt das jetzt, dass du das getestet hast, mit exakt dem 
Beispiel? Oder nimmst du das einfach nur grad mal so an?

Also falls sich das mit deinem einfachen Beispiel, ausschlieslich 
bestehend aus DDR-Initialisierung, Port schreiben, Schleife und darin 
wieder Port schreiben so verhält, dass die Leds an bleiben ist was 
ernsthaft faul. Das sollte so nicht sein. Falls dem so ist brauchen wir 
alle Infos zum Aufbau. Was für ein Controller auf was für einem Board, 
Schaltplan, Foto und/oder Layout von der Platine. Auch Compiler und 
dessen Einstellungen.

von Tobi (Gast)


Lesenswert?

Ich kenne jetzt die UART Bibliothek nicht, aber ich vermute, dass

while(1==1){

    empfangen=uart_getc();

     PORTA = empfangen;

}

immer 0 liefert. Nur wenn ein Zeichen kommt, wird das ganz kurz am Port 
"angezeigt". Danach kommt sofort wieder der IDLE Wert 0 zum tragen! Das 
heißt, für dich siehts immer nach ner 0 aus.

Wie gesagt, nur eine Vermutung.

von Felix (Gast)


Lesenswert?

Mir ist da grad noch was aufgefallen. Es sieht so aus als würdest du die 
UART Library von Peter Fleury verwenden. Bei dieser Bibliothek kannst du 
aber nicht blind die empfangen Daten per uart_getc() abrufen.

Die Funktion uart_getc() wartet nicht auf Daten vom UART. Der Aufruf 
kommt sofort zurück, das Ergebnis ist ein 16bit-Wert. In den oberen acht 
Bit wird mit Flags signalisiert, was von den unteren acht Bit zu halten 
ist. Das wird bei dir in den meisten Fällen das Flag für "es gibt keine 
Daten aus dem UART-Puffer abzuholen" sein. Was da dann genau mit den 
unteren acht Bit ist, kann ich dir nicht sagen, aber gültige Daten 
müssen das auf keinen Fall sein, wenn dir die Flags das nicht eben auch 
signalisieren.

von EAGLE (Gast)


Lesenswert?

Also erstmal danke an alle,
aus mir unerfindlichen gründen gehts jetzt (Wackler??)

von EAGLE (Gast)


Lesenswert?

@ Felix
in Peter Fleurys beispiel uart_text.c steht dazu:
1
for(;;)
2
    {
3
        /*
4
         * Get received character from ringbuffer
5
         * uart_getc() returns in the lower byte the received character and 
6
         * in the higher byte (bitmask) the last receive error
7
         * UART_NO_DATA is returned when no data is available.
8
         *
9
         */
10
        c = uart_getc();
11
        if ( c & UART_NO_DATA )
12
        {
13
            /* 
14
             * no data available from UART 
15
             */
16
        }
17
        else
18
        {
19
            /*
20
             * new data available from UART
21
             * check for Frame or Overrun error
22
             */
23
            if ( c & UART_FRAME_ERROR )
24
            {
25
                /* Framing Error detected, i.e no stop bit detected */
26
                uart_puts_P("UART Frame Error: ");
27
            }
28
            if ( c & UART_OVERRUN_ERROR )
29
            {
30
                /* 
31
                 * Overrun, a character already present in the UART UDR register was 
32
                 * not read by the interrupt handler before the next character arrived,
33
                 * one or more received characters have been dropped
34
                 */
35
                uart_puts_P("UART Overrun Error: ");
36
            }
37
            if ( c & UART_BUFFER_OVERFLOW )
38
            {
39
                /* 
40
                 * We are not reading the receive buffer fast enough,
41
                 * one or more received character have been dropped 
42
                 */
43
                uart_puts_P("Buffer overflow error: ");
44
            }
45
            /* 
46
             * send received character back
47
             */
48
            uart_putc( (unsigned char)c );
49
        }
50
    }

von Felix (Gast)


Lesenswert?

Naja, das ist ja genau das was ich meine. Du kannst nicht einfach 
uart_getc() aufrufen und hoffen das da immer Daten vom UART 
zurückgegeben werden.  Du musst schon noch wie im Beispiel die Flags 
prüfen. Bei den meisten Aufrufen wird dir uart_getc() eben das 
UART_NO_DATA-Flag zurückgeben und du weißt damit, dass eben keine Daten 
empfangen wurden, sprich der Empfangspuffer leer ist.
In den Fall solltest du aber auch nicht die unteren acht Bit des 
Rückgabewertes verwenden und irgendwo zuweisen, da das keine gültigen 
Daten vom UART sein müssen.

von EAGLE (Gast)


Lesenswert?

Ja stimmt danke Felix werds beachten

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.