• Hallo TT-Modellbahner, schön, dass du zu uns gefunden hast.
    Um alle Funktionen nutzen zu können, empfehlen wir dir, dich anzumelden. Denn vieles, was das Board zu bieten hat, ist ausschließlich angemeldeten Nutzern vorbehalten. Du benötigst nur eine gültige E-Mail-Adresse und schon kannst du dich registrieren.
    Deine Mailadresse wird für nichts Anderes verwendet als zur Kommunikation zwischen uns.
    Die Crew des TT-Boardes

Programm für PIC 16F84 gesucht

foxtanz

Foriker
Beiträge
98
Reaktionen
11
Ort
Dresden
Hallo, wer kann mir helfen für einen Mikrocontroller PIC 16F84A ein Programm zu schreiben? Erste Erfahrungen mit Nachbau und Brennen dieses Controllers nach fertiger Anleitung habe ich gesammelt. Ich suche speziell ein Programm das an einem Eingang das L- Signal auswertet und einen Impuls fester Länge an einem Ausgang, z.B. 1 Sekunde ein Signal anliegt. Die Länge des Eingangssignals darf dabei keine Rolle spielen. Erst nach erfolgtem H-Signal am Eingang darf die Schaltung von vorn beginnen. Es dürfte bestimmt nicht all zu schwer sein da ein kleines Programm zu erstellen. Ich könnte das auch mit C-Control umsetzen, allerdings wäre diese zu groß und wäre überdimensioniert. Ich möchte aber bei dem 16F84A bleiben, da ich da schon ein Programmiergerät gebaut habe. Ich habe leider nicht die Zeit mich durch unzählige Bücher durchzulesen. Bestimmt kann mir einer von euch helfen. Danke schon mal im Voraus.
 
Warum friemelst Du Dir da nicht ein Monoflop mit einem NE555 zusammen? Geht einfacher.
 
Noch besser wäre der Einsatz eines 74LS123. Dies ist ein retriggerbarer Monoflop - besser gesagt 2 unabhängige Monoflops.

Du legst auf den Eingang B und /R High - Potential und wertest am Eingang /A die Low-Flanke aus. Als weitere Beschaltung ist noch ein Widerstand und ein Kondensator zur Definition der Zeitkonstante des Ausgangsimpulses nötig. Der Ausgangsimpuls wird dann erzeugt wenn die Flanke am Eingang auf Low fällt. Alternativ steht der Ausgangsimpuls auch negiert zur Verfügung. Google doch mal im Inet, da gibt es zahlreiche Applikationen zum genannten IC.

Ich habe den IC schon oft eingesetzt, funktionierte immer problemlos und die externe Beschaltung ist einfacher als beim PIC und vor allem billiger.

Gruß
Stefan
 
@e-fan
Weil es manchmal doch Spaß macht, mit Kanonen auf Spatzen zu schießen.
(Den konnte ich mir jetzt nicht verkneifen)
@foxtanz
:FF:
geh mal nach PIC-Anwenderforen suchen, da wird Dir sicher geholfen
:) vom Heizer
 
Danke erstmal, die beiden Sachen, NE555 und 74LS123 werde ich mir noch genauer ansehen. Allerdings ich habe hier einige Pic 16F84 schon liegen und da ist auch nur ein Keramikresonator und keine sonstigen Bauelemente anzuschließen und das wollte ich erreichen. Ein Programm einzuspielen ist kein Problem, wenn ich es denn schreiben könnt. Daher suchte ich eure Hilfe.
Ich kann die Meinung mit den Kanonen auf Spatzen und so nicht verstehen. Mit 2 Bauelementen ist das hinzubekommen. Bei allen anderen Lösungen sind es mehr Bauelemente.
 
@foxtanz

Wenn es denn sein soll könnte ich Dir ein Programm schreiben, das sollte nicht so aufwendig sein. Allerdings bräuchte ich mal Zeit übers Wochenende und noch ein paar Angaben - z.Bsp. welcher Port ist der Eingang, welcher der Ausgang, wie lang soll der Ausgangsimpuls sein, wie wird der Takt erzeugt (Keramik oder Quarz) welche Taktfrequenz (ist entscheidend für die Errechnung der Impulslänge).

Gruß
Stefan
 
@TT-STEFAN

Na das nenn ich doch mal ein Angebot.
Der Takt ist 4MHz und wird mit Keramikresonator erzeugt. Der Schaltplan entspricht dem Bild unten nur eben mit Keramikresonator. Auch ein Bild meiner Testplatine, da bekomme ich z.B. ein Blinklicht oder anderes im Netz verfügbares zum Laufen. Der Pic ist der 16F84A. Der Ausgangsimpuls sollte im Programm änderbar sein, Länge wählbar 0,5 - 1 Sekunde. Klar wenn das Programm in Pic übertragen ist, dann ist der Wert fest. Die Ports sind frei wählbar. Es sollte für mich verständlich geschrieben sein, damit ich eventuelle kleine Anpassungen selbst noch vornehmen kann. Ideal wäre es, wenn nach erfolgtem 1. Ausgangsimpuls eine Zeitspanne einstellbar wäre (im Programm fester Wert) so 1- 10 Sekunden das dann erst wieder der Eingang abgefragt wird. Die Schaltung sollte sofort funktionieren wenn Betriebsspannung anliegt (Power on Reset).
Zuviel verlangt?
Würde mich sehr über eine Lösung freuen. Danke schon mal.
 

Anhänge

  • Testplatine PIC 16F84.jpg
    Testplatine PIC 16F84.jpg
    15,8 KB · Aufrufe: 51
  • 16F84Testboard Schaltplan.jpg
    16F84Testboard Schaltplan.jpg
    28,5 KB · Aufrufe: 62
@fox:
Wenn es unbedingt sein muss und Deine Englischkenntnisse nicht gleich Null sind dann such mal nach einem Basic-Compiler für die Pic's. Ich weiß das es einen gibt. Dessen Name heißt (glaub ich) PIC-Basic oder so.
Ein Programmschnippsel würde dann in Teilen so aussehen:

Config... [Controller, also welcher Controller mit welcher Frequenz bla bla bla]
Config IRQn.... [n=Welcher externe IRQ/steigende oder fallende Flanke/Label der IRQ-Routine]
Enable IRQn

Do
nop ["nop" ist bei AVR der Assemblerbefehl für "No Operation", es wird 1 Takt gewartet]
Loop

IRQ-Routine:
Pulseout Portx.y, Zeit
[Zeit in Takten oder ms]
Return

End


Der Code mag aus Profisicht vielleicht Grütze sein, zeigt aber trotzdem das Heizer mit dem Kanonenschuß auf Spatzen recht hat.
Der Controller hat einfach mal nix zu tun.
Die Bezeichnungen weichen bei dem besagten PIC-Basic-Assembler von dem für AVR geringfügig ab aber das Prinzip ist das Gleiche.
Man muss eben in die Befehlsliste schauen und nachlesen wofür welcher steht und da find ich das man Basic einfach am leichtesten erlernen kann.
 
Hallo,

hier gibt es das Basic: http://www.oshonsoft.com/
Damit hab ich auch mal angefangen bzw. mache ganz einfache Sachen damit, kostet aber was.
Die Sprut Seite kennst du bestimmt auch schon.
Ich würde noch auf den PIC 16F627 oder 16f628 umsteigen, das als Empfehlung.

Holger
 
Ich bin nicht so richtig der Fan von Basic für PICs. Meiner Meinung nach lassen sich komplexere Sachen, wie die Auswertung eines DDC - Signals mit Basic nur schwer realisieren.

Da ich schon 880er Prozessoren in Ermangelung passender Interpreter in Assembler programmiert habe tue ich mich mit Assemblerprogrammierung auch leichter. Auch finde ich die Assemblerprogrammierung spannender.

Bezüglich des PIC Typs ist der 16F84 ausreichend solang man keine UART, mehr Speicher oder 3 Timer benötigt - also für die genannte kleine Anwendung geanu das richtige.

Gruß
Stefan
 
Ich find es nach wie vor etwas übertrieben einen µC einzusetzen der Aufgabenbedingt in 99,99999999999999999% der Betriebszeit rein garnichts macht.
Was Deine Meinung zu Basic angeht: Wo ein Wille ist, ist auch ein Weg und hier geht es nicht um die Dekodierung von komplexen Steuersignalen! ;)
 
Ich find es nach wie vor etwas übertrieben einen µC einzusetzen der Aufgabenbedingt in 99,99999999999999999% der Betriebszeit rein garnichts macht.

Dann implementiere ihm doch eine routine zur Errechnung von Phi und Ausgabe über serielle Datenübertragung . :traudich:
 
Ich bin auch nicht der Freund von Basic, einfache Sachen kann man aber gut damit machen und am Anfang hab ich mir dann halt das erzeugte Assemblerlisting angeschaut, um zu sehen wie es umgesetzt wurde.
Komplexe Sachen sind klar nicht machbar, meine Decoder schreib ich auch nicht in Basic !
Zu Kanonen und Spatzen, das muss jeder selbst entscheiden. Jedenfalls ist es ein guter Einstieg.

Holger
 
Hallo und danke an alle, ihr habt mir sehr geholfen.

Auf der Seite www.pic-basic.de habe ich mich bissel in das Programm eingearbeitet und meine ersten Programme erstellt. Danke auch an Holger, für den Link, habe mir dort den Simulator geholt. Der klappt soweit auch super. Nur bei der Geschwindigkeit der Ausführung komme ich nicht klar, der Takt von 4MHz ist richtig eingestellt und der PIC ausgewählt. Leider stimmen die Zeiten der Pausen in dem geschriebenen Programm nicht mit der realen Geschwindigkeit überein, läuft da geschätzt 100x langsamer. Hatte erst gedacht mein Programm hat einen Fehler, aber nein, im richtigen PIC läuft es ordentlich in der gewünschten Zeit (Pausenbefehl) Keine Ahnung wie ich den Simulator überreden kann, der läuft bei mir in Einstellung: Rate Ultimate, die anderen sind noch viel langsamer. Das ist das einzige was mich daran stört. An meinem Rechner kann es nicht liegen, der ist schnell genug (2x 3GHz). Kennt jemand eine Lösung?
Ich hatte mir die letzte Nacht um die Ohren geschlagen und habe dann nach etlichen Versuchen mein gewünschtes Programm selbst erstellt. Wenn man bissel in das Basic eingestiegen ist, dann ist es nicht mehr so schwer. Jedenfalls ist mein PIC fertig und funktioniert so wie ich es wollte.
Ich danke euch allen die dazu beigetragen haben. Abgesehen von der investierten Zeit, mit normalen Schaltkreisen wäre ich vielleicht schneller fertig geworden, aber evtl. auch teurer denn der PIC mir Resonator kostet weniger als 3 Euro und ist garantiert kleiner und meine jetzige Lösung ist flexibel und vor allem ich habe dabei auch einiges Gelernt. Das war es mir wert. Ob der PIC sich 99% langweilt ist doch Nebensache, andere kaufen sich ein Auto mit über 200 PS und werden die weniger als 1% nutzen wenn überhaupt, musste ich einfach mal loswerden wegen den Kanonen und Spatzen. Diesbezüglich bitte keine weiteren Kommentare.

Ich suche noch die Lösung für das Zeitproblem des Simulators.
Dank an alle, Andreas
 
Hallo,

die Zeiten kann der Simulator nicht einhalten, dazu ist die Simulation zu langsam. Ich hab mir damit geholfen, dass ich die Werte als Variablen gemacht habe und währen der Testphase ersetzt habe.
Die Zeiten erreichst du nur im Echtbetrieb.
Aber:
Wartezeiten sollte man sich gar nicht erst angewöhnen. Schöner wäre es wenn du dir z.B. einen Takt im Interrupt programmierst, z.b. Interrupt aller 1/10 Sekunden. Im Interrupt zählst du nur eine Variable hoch. Im Hauptprogramm fragst du diese ab und reagierst entsprechen.
also Variable=10 dann ist eine Sekunde vergangen, mach etwas

Das ist besserer Programmierstil wenn du mal erweitern willst.


(das ist jetzt nur ein Vorschlag wie ich es machen würde, es gibt viele Lösungen und Meinungen).

Du kannst dir auch die entstehenden Assemblerfiles vom Basic mal ansehen und schauen wie es umgesetzt wurde.

Holger
 
Der riesen Vorteil bei Nutzung der Timer und der entsprechenden Interrups ergibt sich aus der Tatsache, dass der PIC nicht in einer Programmschleife auf das Ende der Zeit wartet sondern in der Zwischenzeit noch andere Unterprogramme abarbeiten kann. Bei größeren Programmen kommt man also um die Interruptprogrammierung nicht herum.

Weiterhin ist das Programm bei Nutzung der Timerinterrups einfacher auf PICs mit höherer oder niedrigerer Taktfrequenz einsetzbar. Man muss dann einfach die Zeitkonstante des Timers ändern - bei einer konventionellen Warteschleife müsste jede Warteschleife umprogrammiert werden (jedenfalls bei Assemblerprogrammierung).

Gruß
Stefan
 
Danke euch @Holger & @ Stefan.
Ja Interupts, aber erstmal langsam, habe da noch nie etwas gemacht und für mich ist das alles Neuland und C-Control vor paar Jahren habe ich auch nur in Basic programmiert. Ich bin eher auf der Hardwareschine als Programmierer. Da brauch ich noch ne Weile. Bin schon froh das ich das in der letzten Nacht, war eigentlich keine mehr, hinbekommen habe.
Den PIC Programmer habe ich mir auch erst vor kurzem zusammengelötet, ähnlich Ludipipo und funktioniert bestens.
Andreas

Falls es interessiert, die Lösung in Basic von mir und die funktioniert, aber kein Anspruch auf optimale Lösung.

PIC 16f84
'Variablen deklarieren
VarB i, x
Def Taster = A0 'Taster-Eingang (negativer Impuls)
'--------------
Sound B2, 248, 200 'kurzer Ton Port B2 als Hinweis Strom liegt an

Start:
PBO %1111 = %1111 'Ausgang rücksetzen H
Button Taster, 0, Ablauf 'springe zu Ablauf wenn negativer Impuls an A0
GoTo Start

Ablauf:
PBO %1111 = %1110 'Port PB0 auf 0
Pause 1000 'Pause 1 Sekunde
PBO %1111 = %1111 'Ausgang rücksetzen H
Pause 2000 'Pause 2 Sekunden dann wieder von vorn
GoTo Start
 
...die Zeiten kann der Simulator nicht einhalten, dazu ist die Simulation zu langsam....

Gibt es bei PIC-Basic oder dem jeweiligen Simulator einen Taktzähler der einem anzeigt wie viel Zyklen bis zum nächsten Befehl vergehen?
Bei Bascom (AVR) is das nur ein ganz kleines Fenster das kaum auffällt - aber Gold wert!
Ansonsten hilft nur rechnen. ;)


@fox:
Probier die ganze Chose mal mit einem externen Interrupt (siehe mein Posting weiter oben). Deine Aufgebaute Schleife funktioniert, ist aber nicht nötig.
 
keine Ahnung, in der Simulation war mir die Zeit nicht wirklich wichtig.
Die angegebenen Zeiten werden für den Pic berechnet, nicht für die Simulation.
Wie gesagt mach ich in Basic nicht mehr viel.

Holger
 
Zurück
Oben