atmega32 vergleich mit lcd ausgabe

OP (Firma: bitGate) #2829778
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
#2829801
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.
#2829818
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.
#2829822
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.
#2829827
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)
#2829844
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren