Hile beim PIC12F629

Gast #2270997
Lesenswert?

Hallo habe da eine Frage ich bringe einfach das unten stehende Programm 
nicht zu laufen und zwar am GPIO 0-3 ist ein BCD Schalter den ich 
Abfrage und dann denn Wert in die Zeitschleife reinschreibe und dann 
soll am GPIO5 für diese Dauer ein Signal ausgegeben werden, ein Signal 
kommt auch aber die Dauer verändert sich nicht wenn ich den Schalter 
drehe.

Ich bitte um eure Hilfe.
1
List      p=12f629           
2
  #include <p12f629.inc>        
3

4
  
5

6
__CONFIG  _MCLRE_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_CLKOUT & _BODEN_OFF
7

8
  
9

10
    bsf     STATUS, RP0  
11
    call    0x3FF
12
    movwf   OSCCAL
13
    bcf     STATUS, RP0  
14

15
    bsf     STATUS,RP0        
16
    movlw  d'255'
17
    movwf  CMCON
18
    movlw  b'00011111'
19
    movwf  TRISIO
20
    bcf     STATUS,RP0        
21
  
22
    clrf  GPIO
23
    clrf  20h
24

25

26
Start:  movf   GPIO,w
27
    movwf   30h
28
    movlw   b'00001111'
29
    andwf   30h,f
30
    swapf   30h,w
31
    call   Geschwindigkeit
32
    movwf   20h
33
    bsf    GPIO,5
34
    call  Zeit
35
    bcf    GPIO,5
36
  
37
    
38
  
39
    
40
Geschwindigkeit:   addwf PCL,f
41
    retlw d'16'
42
    retlw d'32'
43
    retlw d'48'
44
    retlw d'64'
45
    retlw d'80'
46
    retlw d'96'
47
    retlw d'112'
48
    retlw d'128'
49
    retlw d'144'
50
    retlw d'160'
51
    retlw d'176'
52
    retlw d'192'
53
    retlw d'208'
54
    retlw d'224'
55
    retlw d'240'
56
    retlw d'255'
57
      
58
    
59

60

61
    
62
Zeit:  movlw  d'255'
63
       movwf  26h
64
l2:    movf  20h,w
65
       movwf  27h
66
l1:    nop
67
       nop
68
       nop
69
       nop
70
       nop   
71
       nop
72
       nop
73
       decfsz  27h,f
74
       goto  l1
75
       decfsz  26h,f
76
       goto  l2
77
       return
78

79
       end
Gast #2271001
Lesenswert?

Mit
movlw   b'00001111'
andwf   30h,f

maskierst du ja die ersten 4 bit. Aber warum drehst du die danach mit
swapf   30h,w
??

Wenn du in BCD eine 1 hast, hast du 00000001 am Port und nach dem 
Maskieren. Nach swapf hast du 00010000 und wenn du das auf den PCL 
addierst, bist du hinter deiner Liste an retlw's... Kommentier mal die 
Zeile mit swapf aus und probiers nochmal.
Gast #2271043
Lesenswert?

Nach "bcf    GPIO,5" läuft dein Programm weiter in das U.Progr. 
"Geschwindigkeit", dort wird das W-Register (Inhalt???) zum PCH addiert 
und landet irgendwo!!

Füge "goto Start" nach "bcf    GPIO,5" ein, dann wird der BCD-Schalter 
laufen abgefragt und nicht nur beim 1. Durchlauf!
#2271168
Lesenswert?

Franz schrieb:
> habe ich
> vieleicht noch was übersehen?

Du kannst noch kein Assembler - das ist alles. Du hast die vorliegende 
Programmstruktur nicht verstanden und weißt nicht was dein Programm 
macht. Das ist das Problem. Entweder lernst du eine (Hoch)sprache die 
einfacher ist und nicht so viel Abstraktionsvermögen erfordert oder 
machst ein vernünftiges Assemblertutorial für PIC.
Gast #2271211
Lesenswert?

Das mit dem Swap ist ein Fehler. Ein Weiterer ist die zumindest gedachte
zeitabhängige Delayroutine mit 0xff zu überschreiben und dadurch jede
configurierte Zeit zunichte zu machen.
Probier mal call Zeit+1 anstelle von call Zeit, aber vorher den
swapf 30h, w in ein mov 30h,w  korrigieren, sonst funktioniert es auch 
nicht.

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