Forum: Compiler & IDEs Tasterzustände auf lcd ausgeben (atmega8, 16x4)


von Stefan F. (feissy)


Lesenswert?

hallo, habe mal eine frage, und zwar möchte ich auf meinem 16x2 Display 
die Tasterzustände von 2 Tastern ausgeben. Das Lcd hängt an PortD und 
Taster an PB0 und PB1.

meine main Funktion sieht bis jetzt so aus:
1
#include <avr/io.h>
2
#include "lcd-routines.h"
3
 
4
int main(void)
5
{
6
    DDRB=0x00;
7
8
    lcd_init();
9
 
10
11
 
12
    while(1)
13
    {
14
    }
15
 
16
    return 0;
17
}

und jetzt hab ich schon gelesen, dass man da mit
1
    char b[20];
2
3
    itoa(PORTA,b,10); 
4
5
    lcdausgabe(b);

oder so arbeiten muss, kann mir da jm vll helfen. ich möchte erst einmal 
nur, dass auf dem Display entweder eine 1 für gedrückt oder eine 0 eben 
für nicht gedrückt erscheint.
gruß stefan

von Karl H. (kbuchegg)


Lesenswert?

Stefan Feismann wrote:

> und jetzt hab ich schon gelesen, dass man da mit

Fang mit dem Tutorium auf dieser Site zu lesen an.
Auch für C-Programmierer sind die ersten paar Kapitel des Assembler 
Tutoriums nicht uninteressant und können zur Ergänzung des 
Avr-gcc-Tutoriums gelesen werden.

>     char b[20];
>
>     itoa(PORTA,b,10);

Du willst nicht den PORTA ausgeben, sondern den PINA.
PORTA  =   Ausgaberegister des Ports A
PINA   =   Eingaberegister des Ports A


Und die 10 da hinten bei itoa, gibt die Basis des Zahlensystems an, in 
dem itoa seinen String erstellen soll. Du willst binär. Also 2


Wie sind deine Taster angeschlossen?
Brauchst du die internen Pullup Widerstände oder hast du extern welche 
drann?

Wenn dir die letzten beiden Rückfragen nichts sagen, dann unbedingt die 
Tutorien vornehmen.

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial
http://www.mikrocontroller.net/articles/AVR-Tutorial

von Stefan F. (feissy)


Lesenswert?

also die taster sind zwischen gnd und PB und haben dann einen 10k pullup 
widerstand gegen +5V.
aber warum muss ich denn binär die zahlen auslesen.geht das dann 
einfacher wenn der nur lesen muss 0b00000010 oder 0b00000001
gruß

von Karl H. (kbuchegg)


Lesenswert?

Stefan Feismann wrote:
> aber warum muss ich denn binär die zahlen auslesen.

Das weiß ich nicht. Du hast dir die Aufgabe gestellt, die 
Tasterzustände als 0 und 1 anzuzeigen und das ganze mit itoa zu machen.

(Und du musst gar nichts auslesen. Zahlen sind in einem Computer einfach 
nur Zahlen, nichts weiter. Aber wenn diese Zahlen irgendwo ausgegeben 
werden, muss man sich entscheiden, wie sie ausgegeben werden. Du kannst 
sie dezimal ausgeben, du kannst sie hexadezimal ausgeben, du kannst sie 
binär ausgeben oder du kannst sie auch in jedem beliebigen anderen 
Zahlsystem ausgeben. Aber all das sind nur verschiedene Ausgabeformen 
der Zahlen. Intern ist alles einfach nur eine Zahl

Das hier:   + + + + + + + + +
ist eine Menge von '+'. Die hast du zb in einem Computer. Auf die 
Ausgabe schreibst du jetzt zb. 9. Das wäre die Anzahl der Mengenelemente 
in dezimaler Form. Du kannst aber auch schreiben 1001. Das wäre dieselbe 
Zahl in binärer Form. Oder du schreibst 11 weil du ein Freak bist und 
oktale Ausgabe bevorzugst. Oder du lässt auf der Anzeige +++++++++ 
erscheinen, oder auf der Anzeige steht
'Lisi ist im Stall'
'Erika ist im Stall'
'Lotte ist im Stall'
...
weil jedes '+' eine Kuh repräsentiert, die abends von alleine in den 
Stall gegangen ist, oder ....
Das ändert aber nichts an dem was du im Computer hast, nur die Art und 
weise wie du ausgibst ändert sich.

Wenns dir Spass macht und für deine Aufgabenstellung zuträglich ist, 
hindert dich niemand, das so zu machen
1
  if( PINB & ( 1 << PB0 ) )
2
    lcdausgabe( "Taster 0 ist aus" );
3
  else
4
    lcdausgabe( "Taster 0 ist ein" );

Viele Wege führen nach Rom und es liegt an dir den richtigen 
rauszufinden, je nachdem was du auf deiner Reise sehen willst.

von Stefan F. (feissy)


Lesenswert?

ja das letzte damit könnte ich anfangen.
wie geb ich denn jetzt den befehl lcdausgabe auf dem display aus.
dazu muss ich doch irgendwie einen befehl verwenden, der mir dann
1
lcdausgabe( "Taster 0 ist aus" );

lcdausgabe auf dem display azeigt.
kann man das mit
1
lcd_print(1,0,"lcdausgabe");

machen ???
gruß

von Gast (Gast)


Lesenswert?

Nein, denn dann würde ja auf dem Display "lcdausgabe" als Text stehen, 
du möchstest aber doch "Taster 0 ist aus" dort stehen haben.

von Stefan F. (feissy)


Lesenswert?

ja genau und mit welchem befehl kann ich das realisieren???
oder muss ich das "lcdausgang" erst als variable speichern, die ich dann 
abrufe?


gruß

von gast (Gast)


Lesenswert?

Wie wäre es, wenn du erst einmal folgendes Tutorial durchliest:
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial
Da steht alles zur LCD Ausgabe und Tastern drin.

von Stefan F. (feissy)


Lesenswert?

ja genau das hab ich bereits gemacht dazu steht im tut ja folgedner code
1
#include <avr/io.h>
2
#include <stdlib.h>
3
#include "lcd-routines.h"
4
 
5
// Beispiel
6
int variable = 42;
7
 
8
int main(void)
9
{
10
    lcd_init();
11
 
12
    // Ausgabe des Zeichens dessen ASCII-Code gleich dem Variablenwert ist
13
    // (Im Beispiel entspricht der ASCII-Code 42 dem Zeichen *)
14
    // http://www.code-knacker.de/ascii.htm
15
    lcd_data(variable);
16
 
17
    set_cursor(0,2);
18
 
19
    // Ausgabe der Variable als Text in dezimaler Schreibweise
20
    {
21
       // ... umwandeln siehe FAQ Artikel bei www.mikrocontroller.net
22
       // WinAVR hat eine itoa()-Funktion, das erfordert obiges #include <stdlib.h>
23
       char Buffer[20]; // in diesem {} lokal
24
       itoa( variable, Buffer, 10 ); 
25
 
26
       // ... ausgeben  
27
       lcd_string( Buffer );
28
    }
29
 
30
    while(1)
31
    {
32
    }
33
 
34
    return 0;
35
}

aber damit komm ich nicht klar deswegen die fragen sry

von Karl H. (kbuchegg)


Lesenswert?

Stefan Feismann wrote:

Du musst den Programmtext auch lesen
1
>        char Buffer[20]; // in diesem {} lokal
2
>        itoa( variable, Buffer, 10 );
3
> 
4
>        // ... ausgeben
5
>        lcd_string( Buffer );

Da steht doch der 'Befehl' (eigentlich ist es eine Funktion), die die 
Ausgabe eines Strings macht. Praktischerweise heist die Funktion dann 
auch noch 'lcd_string'

von Stefan F. (feissy)


Lesenswert?

achso ist das da gemeit ich war schon die ganze zeit am überlegen.
also muss das heißen
1
       char Buffer[20]; // in diesem {} lokal
2
       itoa( PINA, Buffer, 2 ); 
3
4
       // ... ausgeben  
5
       lcd_string( Buffer );

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.