www.mikrocontroller.net

Forum: Compiler & IDEs Mal ne dumme Frage.


Autor: EAGLE (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
 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:
 
#include <avr/io.h>
#include <util/delay.h> // für _delay_ms(zeit);
#include <stdlib.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <avr/pgmspace.h>

#include "uart.h"

#define UART_BAUD_RATE 57600

int main(void)
{
  uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) );
  sei();

        DDRA = 0xFF;


        unsigned int empfangen=0;

  while(1==1){


    empfangen=uart_getc();


    if(empfangen==1){
                  PORTA = 0b00000001;
    }
    if(empfangen==2){
                  PORTA =  0b00000010;
    }
    if(empfangen==3){
                  PORTA = 0b00000100;
    }
    if(empfangen==4){
                  PORTA = 0b00001000;
    }
    if(empfangen==5){
                  PORTA = 0;
    }


  }

} 

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sendest du denn eine 5 oder eine '5'?

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
:-)

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> empfangen=uart_getc();
> if(empfangen==1){

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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
EAGLE schrieb:

> Setze ich nämlich mit
 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?

Autor: EAGLE (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: EAGLE (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Karl heinz Buchegger

ja ich habs auch schon simpler gemacht:
while(1==1){

    empfangen=uart_getc();

     PORTA = empfangen;

}

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:

    PORTA=255;

while(1==1){

    PORTA=0;

}

Autor: M. B. (manubaum) Benutzerseite
Datum:

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

Autor: Felix (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Tobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Felix (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: EAGLE (Gast)
Datum:

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

Autor: EAGLE (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Felix
in Peter Fleurys beispiel uart_text.c steht dazu:
for(;;)
    {
        /*
         * Get received character from ringbuffer
         * uart_getc() returns in the lower byte the received character and 
         * in the higher byte (bitmask) the last receive error
         * UART_NO_DATA is returned when no data is available.
         *
         */
        c = uart_getc();
        if ( c & UART_NO_DATA )
        {
            /* 
             * no data available from UART 
             */
        }
        else
        {
            /*
             * new data available from UART
             * check for Frame or Overrun error
             */
            if ( c & UART_FRAME_ERROR )
            {
                /* Framing Error detected, i.e no stop bit detected */
                uart_puts_P("UART Frame Error: ");
            }
            if ( c & UART_OVERRUN_ERROR )
            {
                /* 
                 * Overrun, a character already present in the UART UDR register was 
                 * not read by the interrupt handler before the next character arrived,
                 * one or more received characters have been dropped
                 */
                uart_puts_P("UART Overrun Error: ");
            }
            if ( c & UART_BUFFER_OVERFLOW )
            {
                /* 
                 * We are not reading the receive buffer fast enough,
                 * one or more received character have been dropped 
                 */
                uart_puts_P("Buffer overflow error: ");
            }
            /* 
             * send received character back
             */
            uart_putc( (unsigned char)c );
        }
    }

Autor: Felix (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: EAGLE (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja stimmt danke Felix werds beachten

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.