Forum: Mikrocontroller und Digitale Elektronik Pic12f509 kleines Programm


von paul3020 (Gast)


Lesenswert?

Guten Tag,
kann mir jemand ein kleines Programm in Asembler für pic 12f509 
schreiben?
- Ist ein Eingang (impuls) belegt, dann soll ein Ausgang für 10 sec. 
eine Led schalten.
Danke.

von Abgucker (Gast)


Lesenswert?

Sind nicht schon Schulferien?

von paul3020 (Gast)


Lesenswert?

ich brauche einfache Beispiele, zum lernen da ich zwei pic 12f509 und 2 
16f84 habe

von RRRRR (Gast)


Lesenswert?

Dazu solltest du aber noch ein paar Info's mehr geben.
Eingang Impulslänge (z.B. min. 2 mS/max. 200 mS)?
Eingang schaltet nach Masse oder es kommen 5V ?

Dann kann dir sicher geholfen werden.

Schulferien sind glaube ich gerade im Saarland...

RRR

von Teo D. (teoderix)


Lesenswert?

Nimm nen 555er, der macht das ohne programmieren.
(NE555)

von SuperD (Gast)


Lesenswert?

wieviel bezahlst du ? sonst www.sprut.de da gibt es sehr sehr sehr sehr 
viele Assemblerbeispiele mit sehr sehr sehr guten Erklärungen ...

von RRRRR (Gast)


Lesenswert?

ohh.. sorry für doppelpost:

Beispiele findest du z.B. bei

www.sprut.de

Zum Lernen sehr gut.

von Teo D. (teoderix)


Lesenswert?

paul3020 schrieb:
> ich brauche einfache Beispiele, zum lernen da ich zwei pic 12f509 und 2
> 16f84 habe
Sprut.de

von paul3020 (Gast)


Lesenswert?

ich möchte einen Piepser steuern, der beim auslösen durch einen 
Quecksilberschalter geschaltet wird für ca 10 sec.

von chris (Gast)


Lesenswert?

1
; GPIO2 = buzzer, GPIO 0/1/3 are triggers with internal pull ups.
2
3
  list      p=12F509            ; list directive to define processor
4
  #include <p12F509.inc>        ; processor specific variable definitions
5
6
  __CONFIG   _MCLRE_ON & _CP_OFF & _WDT_OFF & _IntRC_OSC
7
8
temp  EQU     0x07        ;example variable definition
9
#define GPIO_TRIS 0xff&(1<<2)
10
#define GPIO_VAL  0
11
12
  btfsc 3,7
13
  goto  peep
14
  movwf   OSCCAL            ; update register with factory cal value 
15
init
16
  movlw  6
17
  option  ; enable pull up, wakeup on sleep, ...
18
  movlw  GPIO_TRIS
19
  tris   GPIO
20
  movlw  GPIO_VAL
21
  movwf  GPIO 
22
  movf  GPIO,w
23
  sleep
24
  
25
peep
26
  bsf    GPIO,2
27
  movlw  .153
28
  clrw  1
29
  movwf  temp
30
wait ; 10 seconds
31
  btfss  1,7
32
  goto  $-1
33
  btfsc  1,7
34
  goto  $-1
35
  decfsz  temp
36
  goto  wait
37
  goto  init
38
39
  END                       ; directive 'end of program'

von Abgucker (Gast)


Lesenswert?

paul3020 schrieb:
> ich möchte einen Piepser steuern, der beim auslösen durch einen
> Quecksilberschalter geschaltet wird für ca 10 sec.

http://de.wikipedia.org/wiki/NE555#Monostabile_Kippstufe
http://www.elektronik-kompendium.de/sites/slt/0310121.htm

von paul3020 (Gast)


Lesenswert?

hallo Chris,
vielen Dank für das Programm.
Ist GP2 der Ausgang,
welcher ist der Eingang?
Könntest Du mir Bücher empfehlen wo der Befehlsatz am besten zu lernen 
kann?

von B. S. (bestucki)


Lesenswert?

paul3020 schrieb:
> Könntest Du mir Bücher empfehlen wo der Befehlsatz am besten zu lernen
> kann?

Steht doch alles im Datenblatt.

von Chris B. (dekatz)


Lesenswert?


von Wilhelm F. (Gast)


Lesenswert?

paul3020 schrieb:

> Könntest Du mir Bücher empfehlen wo der Befehlsatz am besten zu lernen
> kann?

In den Datenblättern der PIC ist meistens der Befehlssatz abgebildet.

Detaillierter und auch mit Beispielen findet man ihn unter

http://www.google.de/url?sa=t&rct=j&q=microchip%20mid%20range%20reference%20manual&source=web&cd=1&cad=rja&ved=0CC8QFjAA&url=http%3A%2F%2Fww1.microchip.com%2Fdownloads%2Fen%2Fdevicedoc%2F33023a.pdf&ei=2RrYUbjeC8bZ4QS4wYCYBw&usg=AFQjCNF-IwwtCxjF_wdLKtGyKlfrhxtCOg&bvm=bv.48705608,d.bGE

Mid Range MCU Family Reference Manual.

von chris (Gast)


Lesenswert?

Ja, GP2 ist Ausgang und GP0 , GP1 sowie GP3 sind eingänge, welche die 10
Sekunden triggern, deshalb als Trigger bezeichnet. Diese haben bereits
integrierte pull-up. Dieser uC ist nicht mid range sondern basic range,
also Befehle wie return, retfie, addlw usw kennt er nicht.

von Wilhelm F. (Gast)


Lesenswert?

chris schrieb:

> Dieser uC ist nicht mid range sondern basic range,
> also Befehle wie return, retfie, addlw usw kennt er nicht.

Danke. Ich glaube immer, daß mein PIC12F675 schon minimal ist. Aber es 
gibt ja noch kleinere ganz ohne Interruptmechanismen.

von paul3020 (Gast)


Lesenswert?

Danke nochmals Chris,
kenne mich nicht viel aus,
werde gleich mit den pickit2 programm übertragen und probieren.
Brauche ich für die Schaltung andere externe Bauteile/widerstaand, oder 
geht direkt mit 5v schalten ?
Kann ich etwas von den unteren Sachen abieten als Dank?
Ich habe seit langer zeit was ich nicht unbedigt brauche:
Es sind alles ubenutzte (neu)
 (2 seriele Eproms od.so:)
 93C46 CB1
 93C66 N
 Pic 12C508
 Pic 16f84 A
1x smd Ausführung pic 12f509
1x Pic 18C55 (Grosser Chip mit Fenster uv-löschb.)
1x Atmel 89C2051
meine email: paul3020@web.de
Ist es leichter zu programmieren wenn mann für einfache Sache einen 
ATiny 13
nimmt?

von paul3020 (Gast)


Lesenswert?

hallo wilhelm,
was ist der unterschied zwischen Deinen 12F675 und den 12F509?

von paul3020 (Gast)


Lesenswert?

Hallo Chris,
beim Asembieren, zeigt das Programm 55 Fehler.
was passt nicht?

von paul3020 (Gast)


Lesenswert?

sorry ich meine beim Asemblieren mit Mpasm 5.5

von Chris B. (dekatz)


Lesenswert?

Nö, das läßt sich fehlerfrei Assemblieren - Vorausgesetzt das du 
"absoluten" Code und keinen "relocatablen" Code erzeugen läßt.

Gehst du zu: Project->Build Options ->Project.
Dort wählst du MPASM/C17/C18 Suite und klickst auf "Generate absolute 
code"
dann gehts ohne Fehlermeldungen

von chris (Gast)


Angehängte Dateien:

Lesenswert?

Also bei mir waren es zwei Warnungen, eine berechtigt, die andere kann 
man ignorieren.
Die eine Warnung, bei
  movlw  .153
  clrw  1
sollte es
  movlw  .153
  clrf  1
sein, war ein Fehler meinerseits, daß ich einen falschen Befehl 
geschrieben habe.

Die andere Warnung ist bei:
  decfsz  temp
weil ich nicht decfsz temp,f geschrieben habe, oder diesen Errortyp
mittels errorlevel -305 ausgeblendet habe.

Ich habe zwei MPASM probiert, 5.2 und 5.37 , beide haben kein Problem 
mit
der Datei.

Brauchst nichts dafür anzubieten.
Nein, 5V der Piezo mit Elektronic sowie der Quecksilberschallter sollten
genügen, aber ein  Kondensator zwischen VCC und GND des uC wäre nicht
schlecht. Was aber noch ist,
__CONFIG   _MCLRE_ON & _CP_OFF & _WDT_OFF & _IntRC_OSC
Reset ist an GP3 angeschlossen. Entweder ändere es in
  __CONFIG   _MCLRE_OFF & _CP_OFF & _WDT_OFF & _IntRC_OSC
oder es kann sein daß es da noch einen Widerstand braucht.
Ich hatte dies einfach vom Template Verszeichnis kopiert, deshalb war
es so drin.

von chris (Gast)


Lesenswert?

Also pic lässt sich auch in C, Basic sowie JALv2 programmieren.

Pic haben gewisse Vorteile gegenüber AVR uC.
Gleichzeitig haben auch AVR Controller auch Vorteile gegenüber Pic 
Typen,
wobei ich letztens aber eher anstelle AVR zu ARM gegriffen habe.

Der 12x509 ist ein uC welcher ich eigentlich immer vermieden habe,
den 16x505 (ein 12 Serie) habe ich oft und gerne eingesetzt.

Die 12 Serie von Microchip setzt man eigentlich nur aus Kostengründen 
ein,
ansonsten verwendet man die 16 Serie (14bit Instruction size) oder die
18 Serie (16bit Instruction size).  Es gibt einige Außnahmen, wie
der 16x505 welcher ein 12er Typ ist, oder der  PIC12F675 welcher ein
16er Typ ist. Im Datenblatt merkt man dies schnell.

Ev. zwei Links zusätzlich zu Sprut:
http://users.tpg.com.au/users/talking/index_of_chapters.html
http://users.tpg.com.au/users/talking/Logic%20Probe%20with%20Pulser-Intro.html

von paul3020 (Gast)


Lesenswert?

kriege das leider nicht hin,
Kann mir dass jemand compilieren

von chris (Gast)


Lesenswert?

wenn du weiter oben schaust, findest du die compilierte Version, zwar 
nur
die mit externen MCLR.

von Paul S. (paul3020)


Angehängte Dateien:

Lesenswert?

hallo, super, mit den obigen files, so habe ich eine Vorstellung 
(Vorbild!)
habe die oberen files genomen, doch bekomme fehler beim assemblieren, 
(file neben an)
Habe die obere originaldatei .hex  direkt mit den picKit2 auf den 12f509 
übertragen, eine LED an den GP2 eingest. mit +5v an den GP1, hm geht 
noch nicht.

(muss warscheinlich die Datei include richtig anbinden im Verzeichnis 
laut Fehlerliste?)

von chris (Gast)


Lesenswert?

Du musst mit einem Widerstand mit 5V auf GP3 gehen, da im obigen Hex ein
externer Reset compiliert ist. Klarerweise geht dann GP3 nicht mehr als
IO Pin.

Einmal,
Warning[215] D:\PIC-ANWENDUNGEN\12F509-CHRIS.TXT 9 : Processor 
superseded by command line.  Verify processor symbol.
Dies heisst, daß als Argument ein Prozessor angegeben ist, obwohl er
bereits im asm file einer drin steht. Ev. hast du den falschen 
angegeben.

Error[105]   D:\PIC-ANWENDUNGEN\12F509-CHRIS.TXT 10 : Cannot open file 
(Include File "p12F509.inc" not found)
Das fehlt dir, warscheinlich hast du vergessen den Include Pfad 
anzugeben,
oder musst diese Datei halt in dasselbe Verzeichnis kopieren.
Die restlichen Fehler kommen daher, daß die include Datei nicht gefunden
wurde, da stehen nähmlich die Definitionen dieser Namen drin.

von chris (Gast)


Lesenswert?

Achso, 5V an GP1 ist quatch, wenn du GND auf einen Trigger Pin gibst, 
dann
reagiert er. Zuerst darf aber nichts angeschlossen sein, da interne 
pull-up
und auf Änderung reagiert wird.

von Paul S. (paul3020)


Angehängte Dateien:

Lesenswert?

Hallo,
habe ich das richtig verstanden wie im Bild hier oben?
Habe endlich das Program ohne Fehler assembliert,
aber tut sich immer noch nichts.
Wie gross muss der Widerstand sein? ist 10kohm ok?
Widerstand zu GND?
Schaltet man mit GND Signal an GP1?

von chris (Gast)


Lesenswert?

Ist falsch, GP3 muss nicht auf GND sondern auf VCC, ansonsten ist die
Schaltung ok, ausser dass ein Kondensator zwischen vcc und gnd noch
da sein sollte, 0.1µF als Wert.

von Paul S. (paul3020)


Angehängte Dateien:

Lesenswert?

hallo, danke für die Info.
asembliert ohne Fehler,
die Schaltung wie auf den Bild,
doch Ausgang kommt nicht, wenn ich den Taster schließe (kurzer Impuls).
Was könnte noch sein?

von chris (Gast)


Lesenswert?

#define GPIO_TRIS 0xff&(1<<2)
sollte so sein:
#define GPIO_TRIS 0xff^(1<<2)
TRIS , Eingang ist 1, Ausgang ist 0

Sorry, war ein Tippfehler, habe die Amerikanische Tastatur, da sind
die Zeichen nebeneinander.


Wegen Programm, bei dir hast du MCLR_OFF, also muss GP3 nicht 
angeschlossen
sein.
Probier das Programm nochmals mit den GPIO_TRIS abgeändert.

Ansonsten, wenn das nicht passt, probier sowas, ist dasselbe, nur daß
beim Start die Led 10 sekunden leuchten sollte, so testest du auch
die Led und die Delay_routine.


; GPIO2 = buzzer, GPIO 0/1/3 are triggers with internal pull ups.

  list      p=12F509            ; list directive to define processor
  #include <C:\Programme\Microchip\Mpasm Suite\p12F509.inc>        ; 
processor specific variable
definitions

 ; __CONFIG   _MCLRE_ON & _CP_OFF & _WDT_OFF & _IntRC_OSC
   __CONFIG   _MCLRE_OFF & _CP_OFF & _WDT_OFF & _IntRC_OSC

temp  EQU     0x07        ;example variable definition
#define GPIO_TRIS 0xff^(1<<2)
#define GPIO_VAL  0
#define LED GPIO,2

  movwf   OSCCAL            ; update register with factory cal value
init
  movlw  6
  option  ; enable pull up, wakeup on sleep, ...
  movlw  GPIO_TRIS
  tris   GPIO
  movlw  GPIO_VAL
  movwf  GPIO
  movf  GPIO,w

peep
  bsf    LED
  movlw  .153
  clrf  1
  movwf  temp
wait ; 10 seconds
  btfss  1,7
  goto  $-1
  btfsc  1,7
  goto  $-1
  decfsz  temp,f
  goto  wait
  bcf   LED
  movf  GPIO,W ; for Wake on change
  sleep

  END                       ; directive 'end of program'

von Paul S. (paul3020)


Lesenswert?

super!,danke, geht.
mit Eingang GP0, GP1 und GP3.
Wenn man die Zeit ändern möchte auf das Dopplete (20 sec.)
welchen Wert muss ich geben (bei der Variable nehme ich an, bei Temp 
oder?    )

von Erich (Gast)


Lesenswert?

Oh Paul,
kannst du selbst gar nix lesen oder googlen?
http://www.sprut.de/electronic/pic/assemble/befehle.html
Gruss

von Paul S. (paul3020)


Lesenswert?

ja natürlich Erich, Danke für die Info, schaue gleich rein.
Es ist aber auch so eine grosse Hilfe zu lernen.
Und bedanke mich auch sehr beim Chris.

von chris (Gast)


Lesenswert?

Du willst die Zeit verdoppeln, anstelle von
  movlw  6
  option  ; enable pull up, wakeup on sleep, ...
solltest du
  movlw  7
  option  ; enable pull up, wakeup on sleep, ...

verwenden.

von Paul S. (paul3020)


Lesenswert?

hallo,
wenn movlw 6 ist, dann leuchtet die LED ca. 6 sec.
Wenn movlw 7 ist, sind tatsächlich das doppelte.
Doch bei movlw 8 kommt ein kurzer Blink(1sec.)
muß man für 20 sec. noch etwas anderes ändern?

Wenn man spannung gibt,(beim einschalt.) kommt gleich die Led/Ausgang 
GPIO,2
Wie kann man das machen, daß wenn man einschaltet, der Ausgang nicht 
kommt?
Habe mit bcf GPIO,2 probiert, doch kommt trotzdem (wie die eingestellte 
Zeit)
Wie kann man  praktisch beim einschalten die Ausgänge sichern? (so daß 
die aus bleiben?

von chris (Gast)


Lesenswert?

Datenblatt lesen !

OSCAL hast du dir auch zerschossen, der Fehler ist 19.6% .

Anstelle von .153 .255 eingeben, dann sollten es 10 Sekunden, bzw
20 Sekunden sein.  .255 basierend auf deiner Aussagen von 6 Sekunden.

Wegen Startup,
Es kann sowas sein:
  movwf  GPIO
  movf  GPIO,w
->
  movwf  GPIO
  nop
  movf  GPIO,w
,
oder man muß im Datenblatt nachsehen, bzw Wake up on Change und
Startup Flags.

Lies endlich mal das Datenblatt durch.

von Paul S. (paul3020)


Lesenswert?

oje,
ah, deshalb mit den Osci.
gut, versuche das Datenblatt zu studieren. Danke!

von Kutrut (Gast)


Lesenswert?

Kennst du Parsic ?

von Paul S. (paul3020)


Lesenswert?

nein, habe nicht.
was ist besonders an parsic?

von chris (Gast)


Lesenswert?

Hier eine Funktion ohne TMR0, ohne Wakeup on Pin Change:

; GPIO2 = buzzer, GPIO 0/1/3 are triggers with internal pull ups.

  list      p=12F509            ; list directive to define processor
  errorlevel   0,-305
  #include <p12F509.inc>        ; processor specific variable 
definitions

  __CONFIG   _MCLRE_ON & _CP_OFF & _WDT_OFF & _IntRC_OSC

temp  EQU     0x07        ;example variable definition
d1    EQU     0x08
d2    EQU     0x09
d3    EQU     0x0A

#define GPIO_TRIS 0xff&(1<<2)
#define GPIO_VAL  0

#define RELAIS GPIO,2
#define TASTER GPIO,1

delay_clk_  macro val ; total 134217728 clk
    movlw   (((((val)-.16+4+1)/.8)>>.0)+1)&0xff
    movwf   d1
    movlw   (((((val)-.16+4+1)/.8)>>.8)+1)&0xff
    movwf   d2
    movlw   (((((val)-.16+4+1)/.8)>>.16)+1)&0xff
    movwf   d3
      endm

delay_clk  macro val
       delay_clk_ val+2
       goto  dly_
      endm

init
;  movwf   OSCCAL            ; update register with factory cal value
  movlw  4
  option  ; enable pull up, wakeup on sleep, prescaler = 32, ...
loop
  movlw  GPIO_VAL ; update output value
  movwf  GPIO
  movlw  GPIO_TRIS ; update output direction
  tris   GPIO

  btfsc  TASTER ; gedrückt ?
  goto   loop
  call   dly_60ms ; Entprellung abwarten, ev. Störung ?
  btfsc  TASTER ; gedrückt ?
  goto   loop
; Taster wurde gedrückt
  bsf    RELAIS
  call   dly_20s
  goto   loop

; functions

; wait 20 Seconds


dly_20s ; 16 clk
       delay_clk_ .20000000
dly_
    clrwdt
  decfsz  d1, f
  goto  $+2
        decfsz  d2, f
  goto  $+2
  decfsz  d3, f
  goto  dly_
        retlw   0

dly_60ms
  delay_clk .60000

  END                       ; directive 'end of program'

von Paul S. (paul3020)


Lesenswert?

Guten Abend,
gut, habe wie oben probiert, asembl. ok, ohne Fehler.
aber Ausg. kommt noch nicht..

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.