mikrocontroller.net

Forum: Compiler & IDEs Alle möglichen Probleme


Autor: Malte Struebert (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ich habe ein Programm zur Anzeige von diversen Fahrzeugsensoren
geschrieben (siehe anhang) nun hab ich das Problem das mir das Teil nur
MÜLL auf dem Display ausgibt... wenn ich z.B. den AD Channel 0 auf
masse lege und diesen anzeige (wie momentan codiert) dann bekomme ich
582 angezeigt was ja wohl irgendwie net sein kann... normal sollte ein
unsigned char doch garkein 582 enthalten können oder?!

Bitte helft mir ich bin echt am verzweifeln...

Gruß
Malte.

Autor: Joerg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum er da 582 anzeigt, finde ich auf die Schnelle auch nicht.

Nur paar kleine Anmerkungen:

strcat(s, "") ist ein NOP.  Der gcc erkennt den aber und optimiert
das klaglos weg, aber das ist sicher nicht das, was Du wolltest. :-)

Das (auskommentierte) Gewurschtel mit asm("ror") ist nicht nötig.

unsigned int
getadc(void)
{
        unsigned int adc;

        adc = ADCW;
        return adc / 4;
}
Das da tut genau dasselbe, nur halt in C statt in Assembler. ;-)

Du schaltest ADIE ein, ohne einen Interruptvektor dafür zu haben.
Wehe dem, wenn Du jetzt noch ein sei() irgendwo hast... :)

Allgemein sind die inp()/outp()/sbi()/cbi() Makros auf dem Weg der
Abkündigung.  Benutze die einfachere direkte Zuweisung wie eben
gezeigt, vor allem halt für neuen Code.

Bezüglich Deines eigentlichen Problems, ich würde vermutlich
erstmal versuchen, das mit einer UART-Ausgabe ein bißchen zu
debuggen.  Da kann man mehr an Informationen unterbringen, die
man dann in einem Terminalprogramm verfolgt.  Ein bißchen Platz
wirst Du ja hoffentlich noch haben.  Wenn Du genügend Platz hast,
kannste natürlich auch noch printf() benutzen, das macht die
Sache programmiererfreundlicher.

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was mir beim kurzen durchschauen noch aufgefallen ist: der String für
die (auskommentierte) Kilometeranzeige ist etwas zu kurz. 3-stellige
Zahl + " kmh" + '\0' macht 8 Bytes.

Autor: Malte Struebert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke erstmal für eure Hilfe,
das durch das viele auskommentieren nicht mehr alles perfekt ist ist
mir schon klar, ich hab halt aus lauter verzweiflung erstmal versucht
den Fehler einzugrenzen...

Könnte mir vieleicht jemand auf die schnelle ein kleines Beispiel
basteln, wie ich bei dem Tiny26 den AD Wandler abfrage?! so mit
anständiger initialisierung, auslesen usw... weil joerg ja sagte das
ich keinen Interruptvector habe... was muß dieser tun?! Ein kleines
beispiel währe halt am sinnvollsten.

PS: das mit dem asm(ror) hab ich deshlab gemacht weil ich ja nur einen
8 Bit AD Wandler brauche und so hatte ich das damals in ASM gelöst und
hatte keinen plan wie ich das in C machen sollte ;-)
Ist mein erstes C Projekt für den Atmel und da die Doku nicht so super
toll ist tu ich mich noch etwas schwer damit.
Kann mir vieleicht jemand ein gutes Buch empfehlen für GCC
Programmierung mit dem Atmel, C/C++ Programmieren für den PC kann ich
ja einigermaßen aber mit dem Mikroproz. spez. dingen tu ich mich noch
etwas schwer.

Ne refferenz währe auch net schlecht.

Vielen Dank.
Gruß
Malte.

Autor: Joerg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nun, den größten Teil mit dem AD-Wandler hast Du ja schon auf die
Reihe bekommen.  Das ADIE Bit solltest Du aber eben einfach nur
dann setzen, wenn Du auch mit Interrupts arbeiten willst -- und
dann brauchst Du auch einen Interruptvektor dafür.  Das ist eine
Funktion, die ungefähr so aussieht:

#include <avr/signal.h>

SIGNAL(SIG_ADC)
{
   ...
}

Diese Funktion wird für jede vollständige Konvertierung aufgerufen.
Denk dran, FAQ #1, Variablen, die zwischen normaler Applikation und
Interruptroutinen Daten vermitteln sollen, müssen als »volatile«
deklariert sein.

Welche Doku gefällt Dir denn nicht?  Du fragst am Ende nach einer
Referenz, aber genau das sollte die Doku eigentlich sein.
Entscheidend ist vor allem die avr-libc Dokumentation, die streift
auch die anderen Gebiete mit.  Was Du natürlich unbedingt noch dazu
benötigst, ist das Datenblatt von Atmel.  Für den ersten AVR, mit
dem man arbeitet, braucht man das zwingend ausgedruckt, wenn Du mal
sehr viele verschiedene AVRs haben solltest, mußt Du vielleicht
nicht mehr jedes drucken, aber als PDF solltest Du sie Dir auf alle
Fälle hinlegen und auch zumindest die Dich interessierenden Stellen
(hier also bspw. die zum AD-Wandler) aufmerksam lesen.

Übrigens sind C und C++ zwei sehr verschiedene Sprachen, auch wenn
einem im Microsoft-Umfeld gern der Glaube vermittelt wird, C++ wäre
sowas wie eine Weiterentwicklung von C.

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.