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.
ich brauche einfache Beispiele, zum lernen da ich zwei pic 12f509 und 2 16f84 habe
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
wieviel bezahlst du ? sonst www.sprut.de da gibt es sehr sehr sehr sehr viele Assemblerbeispiele mit sehr sehr sehr guten Erklärungen ...
ohh.. sorry für doppelpost: Beispiele findest du z.B. bei www.sprut.de Zum Lernen sehr gut.
paul3020 schrieb: > ich brauche einfache Beispiele, zum lernen da ich zwei pic 12f509 und 2 > 16f84 habe Sprut.de
ich möchte einen Piepser steuern, der beim auslösen durch einen Quecksilberschalter geschaltet wird für ca 10 sec.
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' |
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
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?
paul3020 schrieb: > Könntest Du mir Bücher empfehlen wo der Befehlsatz am besten zu lernen > kann? Steht doch alles im Datenblatt.
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.
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.
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.
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?
hallo wilhelm, was ist der unterschied zwischen Deinen 12F675 und den 12F509?
Hallo Chris, beim Asembieren, zeigt das Programm 55 Fehler. was passt nicht?
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
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.
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
wenn du weiter oben schaust, findest du die compilierte Version, zwar nur die mit externen MCLR.
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?)
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.
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.
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?
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.
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?
#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'
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? )
Oh Paul, kannst du selbst gar nix lesen oder googlen? http://www.sprut.de/electronic/pic/assemble/befehle.html Gruss
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.
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.
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?
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.
oje, ah, deshalb mit den Osci. gut, versuche das Datenblatt zu studieren. Danke!
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'
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.