Forum: Compiler & IDEs Alle möglichen Probleme


von Malte Struebert (Gast)


Angehängte Dateien:

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.

von Joerg Wunsch (Gast)


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.

von Andreas S. (andreas) (Admin) Benutzerseite


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.

von Malte Struebert (Gast)


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.

von Joerg Wunsch (Gast)


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.

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.