Forum: Mikrocontroller und Digitale Elektronik atmega32 vergleich mit lcd ausgabe


von Lars S. (Firma: bitGate) (mana)


Lesenswert?

Hallo,

ich habe ein Problem mit meiner Schaltung, bzw mit dem Programmieren.

Ich hab an D meinen Display und an C meine Taster.
Jetzt möchte ich es machen, dass wenn ich den ersten Taster drücke "Text 
1" kommt, wenn ich den 2. drücke "Text 2" kommt, usw. Und wenn keiner 
gedrückt ist "No Data" da steht.
Das No Data ist kein Problem, aber ich weiß nicht wie ich das machen 
soll mit dem, das der Display mir Anzeigt wenn ich einen Taster drücke 
(wenn ich loslasse soll dann wieder "No Data" stehen.


MfG,

 Lars

von Rene S. (Firma: BfEHS) (rschube)


Lesenswert?


von Lars S. (Firma: bitGate) (mana)


Lesenswert?

Es ist ja nicht so als ob ich mir das nicht durchgelesen habe. Aber das 
hilft mir mit meinem Problem auch nicht viel weiter. Mein Problem ist 
nicht wie die Taster funktionieren sondern wie ich sage das es dann den 
Text ausgibt.

von Peter II (Gast)


Lesenswert?

lars schuch schrieb:
> wie ich sage das es dann den
> Text ausgibt.

genauso wie du "no data" ausgibst.

von Hubert G. (hubertg)


Lesenswert?

Wie gibst du denn No Data aus?
Den Text gibst du in einen if-Abfrage aus.

von Karl H. (kbuchegg)


Lesenswert?

Lars Schuch schrieb:
> Es ist ja nicht so als ob ich mir das nicht durchgelesen habe. Aber das
> hilft mir mit meinem Problem auch nicht viel weiter. Mein Problem ist
> nicht wie die Taster funktionieren sondern wie ich sage das es dann den
> Text ausgibt.

ist das jetzt eine Fangfrage?

   if( Taste1 gedrückt )
     schreibe Text aufs LCD

   else if( Taste2 gedrückt )
     schreibe anderen Text aufs LCD

   else
     schreibe Defaulttext aufs LCD


Das ist noch nicht der Weisheit letzter Schluss, aber es sollte dich mal 
in die Gänge bringen.

von Lars S. (Firma: bitGate) (mana)


Lesenswert?

In C wäre es ja einfach. Ich brauch es aber in Assembler (tut mir leid, 
vergessen dazu zu schreiben)

@Hubert:
Das gebe ich aus, weil ich ja keinen Taster drücke. Also liegt keine 
Information an, also No Data

von Hubert G. (hubertg)


Lesenswert?

Dann fragst du in Assembler die Tasten ab, wenn eine gedrückt ist, dann 
springst du in die Textausgabe.

von Lars S. (Firma: bitGate) (mana)


Lesenswert?

Den Denkweg habe ich auch, nur nicht das Wissen wie das geht. Sonst 
würde ich ja nicht nachfragen.

von Karl H. (kbuchegg)


Lesenswert?

Lars Schuch schrieb:
> In C wäre es ja einfach. Ich brauch es aber in Assembler (tut mir leid,
> vergessen dazu zu schreiben)

Es funktioniert auch in Assembler prinzipiell nicht anders.
Wenn du das
AVR-Tutorial
studierst, wirst du viele Stellen finden, in denen mit einer gedrückten 
Taste etwas ausgelöst wird. Und das fängt schon beim allerersten 
Tutorial-Artikel an (nach dem allgmeinen Vorgeplänkel), bei dem es darum 
geht, dass mit einer gedrückten Taste eine LED eingeschaltet wird. Bei 
dir ist es halt keine LED sondern ein Text aufs LCD. Aber das Prinzip 
der Abfrage der Taste ist genau dasselbe.

Eigentlich ist das sogar sowas wie die Grundstufe der AVR-Assembler 
Programmierung. Man beginnt damit, eine LED gezielt ein/aus schalten zu 
können. Gleich danach kommt ein Taster ins Spiel, so dass man mit dem 
Taster eine LED einschaltet (und beim Loslassen wieder aussschaltet). 
Und mit diesen beiden Zutaten (LED + Taster) wird erst mal das Setzen, 
Löschen, Abfragen von Portpins bis zur Vergasung geübt.

Es sieht ein wenig komisch aus, wenn du dich schon mit LCD beschäftigst 
aber von den Basisgrundlagen keine Ahnung hast. Das hat so ein wenig was 
von: Ich müsste in der Trigonometrie 2 Zahlen addieren, weiß aber nicht 
wie man addiert.

von Lars S. (Firma: bitGate) (mana)


Lesenswert?

Die LED's an und ausmachen ist kein Problem, das hab ich schon gemacht.

Ein Kollege hat gemeint, ich soll es mal mit dem "brne" Befehl machen. 
Nur wie?

von Karl H. (kbuchegg)


Lesenswert?

Lars Schuch schrieb:
> Die LED's an und ausmachen ist kein Problem, das hab ich schon gemacht.
>
> Ein Kollege hat gemeint, ich soll es mal mit dem "brne" Befehl machen.
> Nur wie?

Erstens findet sich zum Thema "Vergleiche" ebenfalls im AVR-Tutorial 
ein Artikel. Zweitens braucht man den BRNE dazu nicht unbedingt. Du 
kannst genau die gleiche Technik benutzen, wie sie auch beim 
Zusammenspiel von LED und Taster benutzt wird: die 'Bitabfrage und 
Überspring' Befehle SBIS und SBIC. Womit wir wieder beim ersten 
Programmierartikel im AVR-Tutorial wären.

Steht alles im AVR-Tutorial. Nur Lesen musst du selber.
Und falls du es nicht gemerkt hast. Ich verlinke dir ständig das 
AVR-Tutorial und würde es sehr begrüssen, wenn du endlich mal 
draufklickst und dort beim ersten Kapitel (Irgendwas mit I/O, den 
genauen Titel weiß ich nicht auswendig) endlich mal zu lesen anfangen 
würdest.

von Lars S. (Firma: bitGate) (mana)


Lesenswert?

Ich habs doch gelesen, aber nicht verstanden. Also suche ich jetzt 
hilfe. Und was wird mir gesagt. Ich soll lesen...

Und zu dem wegen verlinken sag ich nichts. Weil ich ja nicht ganz so 
dumm bin wie du vielleicht denkst.

von Karl H. (kbuchegg)


Lesenswert?

Lars Schuch schrieb:
> Ich habs doch gelesen, aber nicht verstanden.

Was hast du nicht verstanden?

 Das man mit

    SBIS PIND, 4

das Bit 4 vom Eingangsport PIND abfrägt und wenn dieses auf 1 ist, dann 
wird der nächste Befehl im Programm übersprungen? (Der nächste Befehl 
könnte zb sein: Springe zu einer STelle im Programm an der "Test1" aufs 
LCD ausgegeben wird.

Was ist daran nicht zu verstehen?
(Die Frage ist ernst gemein. Denn wenn sich dein Nichtverstehen als ein 
grundsätzliches Problem herausstellt, dann muss man darüber nachdenken, 
ob im Tutorial an dieser Stelle nicht Information fehlt)

von Lars S. (Firma: bitGate) (mana)


Lesenswert?

Also abgewandelt etwa so:
1
 
2
.include "m32def.inc"
3
 
4
         ldi r16, 0xFF
5
         out DDRD, r16     
6
                             
7
         ldi r16, 0x00
8
         out DDRC, r16    
9
 
10
loop:    sbic PIND, 0        
11
         
12
         "Textausgabe"
13
         rjmp loop
14
 
15
         "No Data"        
16
 
17
ende:    rjmp ende           ; Endlosschleife

von Karl H. (kbuchegg)


Lesenswert?

Lars Schuch schrieb:
> Also abgewandelt etwa so:
>
> .include "m32def.inc"
>
>          ldi r16, 0xFF
>          out DDRD, r16
>
>          ldi r16, 0x00
>          out DDRC, r16
>
> loop:    sbic PIND, 0
>
>          "Textausgabe"
>          rjmp loop
>
>          "No Data"

Nein.
Mit dem SBIC kannst du nur EINEN Befehl überspringen lassen. Und die 
Textausgabe selber wirst du nicht in EINEM Befehl unterbringen.

Aber es schreibt dir ja niemand vor WELCHER Befehl es ist, der 
übersprungen werden soll. Das kann ja auch ein RJMP sein, der zu einer 
STelle im Programm springt, an der dann die Textausgabe gemacht wird und 
von wo es dann wieder in einem Sprung zurück zur Hauptschleife geht.


Ich geh mal davon aus, dass deine Taster standardmässig angeschlossen
sind: Ist der Taster nicht gedrückt, dann ist der Pin auf 1. Ist er
gedrückt, dann ist der Pin auf 0. Wenn das nicht so ist, dann eben nicht 
SBIS sondern SBIC. Ich nehme weiters an, dass deine beiden Taster an 
PINC die Bits 0 und 1 sind)
Damit schreibt sich die Logik schon fast von alleine
1
        .....
2
3
loop:   SBIS  PINC, 0            ; Taste 0 gedrückt ?
4
        RJMP  WriteText1         ; ja: ersten Text ausgeben
5
        SBIS  PINC, 1            ; 0 war nicht gedrückt, was ist mit Pin 1?
6
        RJMP  WriteText2         ; okidoki, ist gedrückt
7
        RJMP  WriteText3         ; weder 0, noch 1 war gedrückt
8
        RJMP  loop               ; an und für sich kann dieser RJMP nie
9
                                 ; erreicht werden. Ich lass ihn aber trotzdem
10
                                 ; damit man sieht, dass hier die Haupt-
11
                                 ; schleife zu Ende ist.
12
13
WriteText1:
14
        .... Text 1 ausgeben .....
15
        RJMP  loop
16
17
WriteText2:
18
        .... Text 2 ausgeben .....
19
        RJMP  loop
20
21
WriteText3:
22
        .... Text 3 ausgeben .....
23
        RJMP  loop

von Lars S. (Firma: bitGate) (mana)


Lesenswert?

Danke. Jetzt weiß ich wie's gemeint ist.

Dann muss ich mit meinem Kollegen nochmal reden, weil das komplett 
anders ist wie er meinte.

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.