-
Hallo erstmal!
Wenn du schon mal C++ programmiert hast, würdest du dir vielleicht leichter tun, den PIC mit C zu programmieren. Dabei ist die LCD Ansteuerung auch etwas übersichtlicher. Kostenlose Version des HiTech Lite Compilers bekommst du von www.hitech.com
Wenn du nur in einer Zeile einen schwarzen Balken hast, dann ist das Display noch nicht initialisiert. Da du aber das Sprut Programm drauf hast, schätz ich dass da ein Hardware Fehler vorliegt.
Funktioniert deine J Taste wieder?
-
Hallo,
habe leider nicht die Zeit Dein ganzes Programm anzuschauen, aber hast Du mal den Debugger benutzt um zu sehen was bei Dir passiert, nur mal so vom Ablauf.
Was mir sofort auffällt:
Du musst mal mehr auf Goto aufpassen, (Kennst Du den Unterschied zwischen Call und Goto?) da haut schon vieles nicht hin...
Und ordne Deine Unterprogramme mal sinnvoll an, so siehst Du bei größeren Programmen kaum noch durch.
Gruß André
-
Also für mich bestand der unterschied zwischen Call und goto einfach nur darin, dass ich bei CALL "return" am ende der Unterprogramme schreiben muss, damit der Pic von der gesprungenen Zeile aus wieder weiter geht. Ist das so korrekt?
Das mit der Sprut LCD Ansteuerung ist etwas komisch. Ich hab es geschafft, dass das Display "Hallo" ausgibt, aber leider nur. wenn ich mit dem Finger PIN 3 (RA4/T0CLK) berühre... was könnte hier das Problem sein?
-
Yep,...
Call ist Unterprogrammaufruf, nach call wird weiter abgearbeitet, aber doch nicht nach Goto.
Nun schau Dir mal als Beispiel zwei Deiner Aufrufe an
Code:
Main
goto clrdisplay
goto Bereit
...
wie soll er von goto clrdisplay jemals zu goto Bereit kommen?
Code:
Alarm1
goto clrdisplay
movlw 'A'
movwf LcdDaten
call OutLcdDaten
movlw 'l'
Oder wie soll er bei Aufruf Alarm1 wenn er zu crldisplay verzweigt mit dem Rest ab movlw 'A' weitermachen können.
Da kommt er doch niemals hin...
Gruß André
-
Ahsooo. jetz wirds mir klar. Logisch dass das was ich da gemacht hab recht sinnlos ist.
Ich hab das mit dem Display gestern übrigens noch hinbekommen. Ich hab übersehen, dass MCLR lowaktiv ist und damit natürlichweise auch kein "Hallo" angezeigt werden kann.
Danke Andre für deine Hilfe, ich werd mich ransetzen und mich wieder melden ;)
(Zu meinem J: ich sitze am Arbeitsrechner, da funktioniert das J einwandfrei, mein Laptop ist zur Reparatur, ohne J gehts halt doch nicht, da darf man sich nichts vormachen ;) )
-
Das errinnert mich an mein 2. Aubildungsjahr, wobei der Beruf da noch Kommunikationselektroniker hieß. *g*
Leider durften wir damals auch schon nicht in C programmieren.
Und ich hab auch mit den selben Problemen gekämpft wie du!! *g*
Aber immerwieder schön zusehen, dass man nicht als einziger mit den Problemen zu kämpfen hatte!! :-)
Kleiner Tipp:
Sobald du nicht mehr in Assembler programmieren musst. Steig um auf C! Das macht dann erst richtig Spaß!!! *lol*
Also viel Spaß noch beim Basteln.
Gruß
Stefan
-
Guten morgen!!!
Ich hab das Programm jetzt zum laufen bekommen. Es scheint hier und da noch etwas verbuggt, aber im großen und ganzen sollte es so funktionieren, bis auf eine Kleinigkeit...
hier der code:
Code:
list P=16F84a.inc
; PORTA: 0 -
; 1 -
; 2 -
; 3 -
; 4 -
; PORTB: 0 LCD Display E
; 1
; 2 LCD Display RS
; 3 LCD Display R/W
; 4-7 LCD Display D4 .. D7
#include <P16f84.INC>
__CONFIG _PWRTE_ON & _WDT_OFF & _XT_OSC
w_copy Equ 0x20
s_copy Equ 0x21
LcdDaten Equ 0x22
LcdStatus Equ 0x23
loops EQU 0x24
loops2 EQU 0x25
; Constanten festlegen
PORTControl equ PORTB
PORTData equ PORTB
LcdEnable equ 0
LcdRw equ 3
LcdRs equ 2
Ini_con Equ B'00000000'
Ini_opt Equ B'00000010'
Init bsf STATUS, RP0
movlw Ini_opt
movwf OPTION_REG
movlw B'11111000'
movwf TRISA
movlw B'00000000'
movwf TRISB
bcf STATUS, RP0
clrf PORTA
clrf PORTB
movlw Ini_con
movwf INTCON
BSF TRISA, 0
bsf TRISA, 1
bsf TRISA, 2
bsf TRISA, 3
bsf TRISA, 4
call InitLCD
goto Main
InitLCD
movlw D'255'
movwf loops
call WAIT
movlw B'00110000'
movwf PORTB
bsf PORTB, LcdEnable
nop
bcf PORTB, LcdEnable
movlw D'50'
movwf loops
call WAIT
movlw B'00110000'
call Control8Bit
movlw B'00110000'
call Control8Bit
movlw B'00100000'
call Control8Bit
movlw B'00000001'
call OutLcdControl
movlw B'00101000'
call OutLcdControl
movlw B'00001000'
call OutLcdControl
movlw B'00000110'
call OutLcdControl
movlw B'00000011'
call OutLcdControl
movlw B'00001111'
call OutLcdControl
return
Control8Bit
movwf PORTB
bsf PORTB, LcdEnable
nop
bcf PORTB, LcdEnable
movlw D'10'
movwf loops
call WAIT
return
OutLcdControl
movwf LcdDaten
call LcdBusy
movf LcdDaten, w
andlw H'F0'
movwf PORTData
bsf PORTControl, LcdEnable
nop
bcf PORTControl, LcdEnable
swapf LcdDaten, w
andlw H'F0'
movwf PORTData
bsf PORTControl, LcdEnable
nop
bcf PORTControl, LcdEnable
return
WAIT
top movlw .110
movwf loops2
top2 nop
nop
nop
nop
nop
nop
decfsz loops2, F
goto top2
decfsz loops, F
goto top
retlw 0
LcdBusy
bsf PORTA, 1
bsf STATUS, RP0
movlw B'11110000'
iorwf TRISB, f
bcf STATUS, RP0
BusyLoop
bcf PORTControl, LcdRs
bsf PORTControl, LcdRw
bsf PORTControl, LcdEnable
nop
movf PORTData, w
movwf LcdStatus
bcf PORTControl, LcdEnable
nop
bsf PORTControl, LcdEnable
nop
bcf PORTControl, LcdEnable
btfsc LcdStatus, 7
goto BusyLoop
bcf PORTControl, LcdRw
bsf STATUS, RP0
movlw B'00001111'
andwf TRISB, f
bcf STATUS, RP0
bcf PORTA, 1
return
OutLcdDaten
bsf PORTA, 2
movwf LcdDaten
call LcdBusy
movf LcdDaten, w
andlw H'F0'
movwf PORTData
bsf PORTControl, LcdRs
bsf PORTControl, LcdEnable
nop
bcf PORTControl, LcdEnable
swapf LcdDaten, w
andlw H'F0'
movwf PORTData
bsf PORTControl, LcdRs
bsf PORTControl, LcdEnable
nop
bcf PORTControl, LcdEnable
bcf PORTControl, LcdRs
bcf PORTA, 2
return
Bereit
movlw 'B'
movwf LcdDaten
call OutLcdDaten
movlw 'e'
movwf LcdDaten
call OutLcdDaten
movlw 'r'
movwf LcdDaten
call OutLcdDaten
movlw 'e'
movwf LcdDaten
call OutLcdDaten
movlw 'i'
movwf LcdDaten
call OutLcdDaten
movlw 't'
movwf LcdDaten
call OutLcdDaten
goto Maintop
Main
CALL clrdisplay
goto Bereit
Maintop
BTFSC PORTA,0
goto Alarm1
btfsc PORTA,1
goto Alarm2
btfsc PORTA,2
goto Alarm3
btfsc PORTA,3
goto Alarm4
btfsc PORTA,4
goto Alarm5
goto Maintop
Alarm1
CALL clrdisplay
movlw 'A'
movwf LcdDaten
call OutLcdDaten
movlw 'l'
movwf LcdDaten
call OutLcdDaten
movlw 'a'
movwf LcdDaten
call OutLcdDaten
movlw 'r'
movwf LcdDaten
call OutLcdDaten
movlw 'm'
movwf LcdDaten
call OutLcdDaten
movlw '1'
movwf LcdDaten
call OutLcdDaten
goto check1
Alarm2
call clrdisplay
movlw 'A'
movwf LcdDaten
call OutLcdDaten
movlw 'l'
movwf LcdDaten
call OutLcdDaten
movlw 'a'
movwf LcdDaten
call OutLcdDaten
movlw 'r'
movwf LcdDaten
call OutLcdDaten
movlw 'm'
movwf LcdDaten
call OutLcdDaten
movlw '2'
movwf LcdDaten
call OutLcdDaten
Goto check2
Alarm3
call clrdisplay
movlw 'A'
movwf LcdDaten
call OutLcdDaten
movlw 'l'
movwf LcdDaten
call OutLcdDaten
movlw 'a'
movwf LcdDaten
call OutLcdDaten
movlw 'r'
movwf LcdDaten
call OutLcdDaten
movlw 'm'
movwf LcdDaten
call OutLcdDaten
movlw '3'
movwf LcdDaten
call OutLcdDaten
Goto check3
Alarm4
call clrdisplay
movlw 'A'
movwf LcdDaten
call OutLcdDaten
movlw 'l'
movwf LcdDaten
call OutLcdDaten
movlw 'a'
movwf LcdDaten
call OutLcdDaten
movlw 'r'
movwf LcdDaten
call OutLcdDaten
movlw 'm'
movwf LcdDaten
call OutLcdDaten
movlw '4'
movwf LcdDaten
call OutLcdDaten
Goto check4
Alarm5
call clrdisplay
movlw 'A'
movwf LcdDaten
call OutLcdDaten
movlw 'l'
movwf LcdDaten
call OutLcdDaten
movlw 'a'
movwf LcdDaten
call OutLcdDaten
movlw 'r'
movwf LcdDaten
call OutLcdDaten
movlw 'm'
movwf LcdDaten
call OutLcdDaten
movlw '5'
movwf LcdDaten
call OutLcdDaten
Goto check5
check1
btfsc PORTA,0
goto check1
CALL clrdisplay
goto Main
check2
btfsc PORTA,1
goto check2
CALL clrdisplay
goto Main
check3
btfsc PORTA,2
goto check3
CALL clrdisplay
goto Main
check4
btfsc PORTA,3
goto check4
CALL clrdisplay
Goto Main
check5
btfsc PORTA,4
goto check5
CALL clrdisplay
Goto Main
clrdisplay
movlw D'255'
movwf loops
call WAIT
movlw B'00110000'
movwf PORTB
bsf PORTB, LcdEnable
nop
bcf PORTB, LcdEnable
movlw D'50'
movwf loops
call WAIT
movlw B'00110000'
call Control8Bit
movlw B'00110000'
call Control8Bit
movlw B'00100000'
call Control8Bit
movlw B'00000001'
call OutLcdControl
movlw B'00101000'
call OutLcdControl
movlw B'00001000'
call OutLcdControl
movlw B'00000110'
call OutLcdControl
movlw B'00000011'
call OutLcdControl
movlw B'00001111'
call OutLcdControl
return
end
Port RA4 macht mir Probleme, er nimmt mein High nicht an... es passiert gar nichts. Muss ich noch eine andere Einstllung vornehmen, damit er als Eingang klassifiziert wird, oder hab ich sonst etwas vergessen?
Hier hab ich auf Eingang geschalten:
Code:
Init bsf STATUS, RP0
movlw Ini_opt
movwf OPTION_REG
movlw B'11111000'
movwf TRISA
movlw B'00000000'
movwf TRISB
bcf STATUS, RP0
clrf PORTA
clrf PORTB
movlw Ini_con
movwf INTCON
BSF TRISA, 0
bsf TRISA, 1
bsf TRISA, 2
bsf TRISA, 3
bsf TRISA, 4
Was hab ich falsch gemacht?
Ich wünsch euch allen ne erfolgreiche Woche !
-
Korrektur 8-[
Ich habe den RA4 probeweise nicht als Eingang deklariert, erfolgreich. es gibt aber leider noch ein Problem, dessen Lösung ich einfach nicht finde.
Wenn ich einen High Pegel an Pin1 lege, passiert nur eins: Das Display geht aus (?)... nehme ich den High Pegel weg, so erscheint ganz kurz "Alarm3" auf dem Display und dann wieder "Bereit".
Wo kann da das Problem liegen? Es ist ja eigentlich alles gleich programmiert... Gibt es eine Besonderhit an Pin 1? Oder sieht jemand einen Programmierfehler, der mir nicht auffällt?
-
könnte vielleicht daran hängen, dass du in den LCD-Routinen immernoch RA1,
Code:
LcdBusy
bsf PORTA, 1
.
.
.
.
bcf PORTA,1
und
Code:
OutLcdDaten
bsf PORTA, 2
.
.
.
bcf PORTA,2
drin stehen hast!!
Ich würde zwar generell sagen, das es nichts ausmacht, da er den Befehl nicht übernimmt, wenn der PORT-Pin als Eingang geschaltet ist.
Aber ich hab schon ganz andere Mysterien aufm PIC erlebt.
Check das mal nach! :-)
Gruß
Stefan
-
...und es macht doch was aus...
genau dasselbe ist mir dann auch aufgefallen. Probeweise ein ; davor gesetzt. Klappt... nur das der Fehler nun nicht mehr an pin1 sondern an pin 18 tranferriert wurde ;)
Dasselbe ; nochmal vor die andere... und schon liegt der Fehler nicht mehr an Pin 1... und auch nicht mehr an pin 18...sondern an pin17...
ich wusste nicht weiter, also muss ich den Fehler wohl so hinnehmen. Alles rückgängig gemacht und hin nd her überlegt. Dann hab ich einfach beschlossen, auf pin1 meine Lichtschranke zu setzen. Gibt die ein Signal, dann nur Kurz. Den Rücksprung in "Bereit" entfernt, und ein Sleep hinten ran gesetzt. Nun erscheint bei einem Kurzen Impuls auf pin1 LICHTSCHRANKE auf dem Display...und bleibt. In meiner endschaltung werde ich dann wohl oder übel einen "Pseudo-Lichtschrankenreset"-Taster einbauen, der eben den ganzen Pic zurücksetzt.
Nunja, eigentlich wollte ich noch ein paar andere Sachen mit einbauen, aber mitlerweile bin ich mit dem jetzigen Resultat zufrieden und hab erstmal die faxen mit dem Pic dick.
Obwohl... ich bekomme doch Lust auf einen Quick Power On Self Test für meine Alarmanalge... gesteuert von meiner neuen Leidenschaft ^^
Mal sehn was sich da berichten lässt ^^