Programmer to target power is enabled - VDD = 5,000000 volts.
10
11
Device Erased...
12
13
Programming...
14
15
The following memory area(s) will be programmed:
16
program memory: start address = 0x0, end address = 0x1ff
17
program memory
18
Address: 0 Expected Value: a01 Received Value: 0
19
configuration memory
20
User Id Memory
21
Failed to program device
der anschluss PICKIT -> PIC:
pin 1 -> MCLR
pin 2 -> VDD
pin 3 -> VPP
pin 4 -> ICSPDAT
pin 5 -> ICSPCLK
Zusätzlich ein 4k7 wiederstand zwischen VPP und MCLR und eine Externe 5
V Spannungsversorgung. Die Versorgung vom PICKIT ist auch auf 5 V
eingeschaltet.
Ich kann den Fehler einfach nicht finden. Bitte um Hilfe.
Robert schrieb:> pin 3 -> VPP
Äh,muss da nicht GND sein?
Schau mal ins "PICkit™ 3 Programmer/Debugger User’s Guide", Page 15
(ww1.microchip.com/downloads/en/DeviceDoc/51795B.pdf)
/regards
leider war der Fehler mit dem Widerstand nur im Text, nicht in der
"Schaltung". ich weiß es ist etwas chaotisch, aber ich denke das alles
zu erkennen ist. die Klemme daneben ist für das PICKIT 3 konzipiert und
ich habe es auch unter mit ihr versucht, leider ohne Erfolg. Da ich
nicht weiß wo der Fehler ist, habe ich beides ausprobiert.
Das mit dem ground versteh ich nicht. habe mir die entsprechende Seite
angesehen, aber Vss muss doch nur an Vss vom PIC
Soviel ich weiß muss die Verbindung bei VDD trotzdem hergestellt werden,
damit das PK3 auch die spannung vom Target hat.
Du solltest bei externer Versorgung auf jeden Fall die
Spannungsversorgung über das PicKit wieder abschalten.
Die einfachste Verdrahtung hast du, wenn du für die ersten
Programmierversuche die externe Versorgung weglässt und erstmal nur mit
dem PK arbeitest.
Hat damals bei mir jedenfalls gut geklappt, ich vermeide externe
Versorgung normalerweise, braucht nur mehr Strippen.
Auf deinem Bild ist rot Pin 1 (MCLR) und danach gelb VDD, grün VSS,
usw.?
Grüße
Karsten
>> Vss muss doch nur an Vss vom PIC>Nicht nur. Vss muss auch an den Vss Anschluss vom PicKit. Das gleiche>gilt für Vdd.
Danke, das habe ich aber vorrausgesetzt.
ich denke mein Hauptproblem war der µC selbst. ich habe mir nochmal ein
neuen besorgt, die verkabelung neu rauf gesetzt und dieses mal konnte
ich ein Programm instalieren.
ich habe den code umgeschieben, damit die LED auf der seite der Masse
ist.
1
voidmain(void)
2
{
3
RA1=0x00;
4
TRISA=0xFE;
5
6
while(1)
7
{
8
RA2=1;
9
/* __delay_ms(100);
10
RA1 = 0;
11
__delay_ms(100); */
12
}//end while
13
return;
14
}//end main
der µC verhält sich aber so was von gar nicht so, wie ich es erwartet
habe.
https://dl.dropboxusercontent.com/u/88893402/2016-11-16%2021.03.38.3gp
Für alle, die sich das Video nicht ansehen wollen: die LED blinkt mehr
oder weniger Asynchron. Was mich auch verunsichert: der Ausgang
darunter, also RA3 blinkt genau so.
Bitte darum mir auch das noch zu erklären. auch wenn das eigentliche
Problem damit gelöst ist.
Robert schrieb:> Bitte darum mir auch das noch zu erklären. auch wenn das eigentliche> Problem damit gelöst ist.
Vielleicht postest du besser erst mal den Code, mit dem angeblich
irgendwas blinkt...
( Komplett, mit Config-Bits und Allem)
(( Schaltplan und Bild von der neuen Verkabelung wäre auch nett ;-))
/** D E C L A R A T I O N S **************************************************/
22
//#pragma code
23
voidmain(void)
24
{
25
RA1=0x00;
26
TRISA=0xFE;
27
28
while(1)
29
{
30
RA2=1;
31
/* __delay_ms(100);
32
RA1 = 0;
33
__delay_ms(100); */
34
}//end while
35
return;
36
}//end main
Der Kondensator hat 100 µF und 16V. Ich habe ihn als Abblockkondensator
eingebaut. falls er irgendwo anders besser platziert ist bitte ich
darum, mich Aufzuklären.
ja darum bitte ja ich.
das Hochgeldende Video Zeigt doch eine Blinkende LED bei RA2. Das hier
gezeigte Programm ist das einzige, was ich auf MPLAB überhaupt habe. Ich
kann es mir nicht erklären, daher stelle ich die Frage ins Forum.
Das muss wohl eine spezielle Blinkt LED sein. Die schließt man einfach
an eine Spannungsquelle an und die blinkt. uC braucht man dafür gar
nicht.
Bei "normalen" LEDs baut man auch einen Vorwiderstand ein un verlässt
sich nicht darauf, dass der uC eh nicht genug Strom bringt, um die LED
zu zerstören. Sieht alles bisher eher noch relativ hoffnungslos aus. Was
ein Schaltplan ist scheint auch nicht bekannt zu sein. Woher stammt der
Code?
<Edit> eigentlich wollte ich ja was ganz anderes schreiben.:
Ein Blockkondensator hat gewöhnlich 100nF, nicht 100 uF und wird so nahe
wie möglich an die Versorgungspins. Also hier womöglich quer über den
PIC.
Robert schrieb:> Der Kondensator hat 100 µF und 16V. Ich habe ihn als Abblockkondensator> eingebaut. falls er irgendwo anders besser platziert ist bitte ich> darum, mich Aufzuklären.
Der Elko ist gut zur Pufferung der Versorgungsspannung und kann da
bleiben, wo er ist. Als Abblock-Kondensator taugt er aber nicht! Der
Abblock-C sollte ein Keramik-Kondensator mit üblicherweise 100nF sein
und - ganz wichtig!!! - möglichst direkt (d.h. ohne Zentimeter lange
Leitungen dazwischen) mit den Versorgungsspannungs-Pins des Controllers
verbunden sein.
Vermutlich arbeitet Dein Quarzoszillator auch nicht richtig - da gehören
noch Last-Kondensatoren dran (2x 22pF oder so), guck ins Datenblatt des
PICs!
Thomas E. schrieb:> Vermutlich arbeitet Dein Quarzoszillator auch nicht richtig - da gehören> noch Last-Kondensatoren dran
Ist mir gar nicht aufgefallen, weil ich gewöhnlich den internen
Oszillator oder Resonatoren mit integrierten Kondensatoren verwende.
Stimmt aber!
Wird immer hoffnungsloser ;-)
"Robert" verarscht uns, oder hat noch einiges an Grundlagen nachzuholen.
Zu Deinem Programm:
Robert schrieb:> TRISA = 0xFE;
damit wird RA0 auf Ausgang geschaltet.
Ob Du danach RA1 oder RA2 auf 1 setzt, und die LED an RA1 oder RA2
angeschlossen ist, ist alles wurscht - es hat keine Auswirkung, da diese
Pins auf Eingang konfiguriert sind.
muss leider enttäuschen, was die LED angeht und zwar in Doppelter
Hinsicht. Zum einen ist es eine gewöhnliche weiße LED, die, wenn man sie
ohne Vorwiderstand an die Versorgungsspannung einfach Weiß leuchtet.
Dies kann ich ohne große Bedenken tuhen, da es sich ja um eine Weiße LED
handelt und diese eine Flussspannung von 3 - 4 Volt haben.
Bei einen so Übersichtlichen Aufbau hielt ich es nicht für nötig ein
Schaltplan daraus zu erstellen.
Ich dachte den Code hätte ich von spruts kopiert. kann aber die
entsprechende Seite nicht mehr finden.
Geil, ne gewisse LED. Braucht die keinen Vorwiderstand um einen
definierten Strom zu bekommen?
Schließe die doch bitte mal an eine 5 V Versorgung an und schau mit
welcher Farbe und wie lange sie leuchtet.
Hallo Robert,
ist da in deinem Bildle überhaupt ein Wiederstand zwischen der LED und
dem PIC?
Ist sehr unscharf, ich seh keinen.
Auch seh ich da einen Wiederstand von pin4 (*MCLR/*RESET) nach GND
anstelle nach VCC ?
mfG
Peter
Robert schrieb:> Dies kann ich ohne große Bedenken tuhen, da es sich ja um eine Weiße LED> handelt und diese eine Flussspannung von 3 - 4 Volt haben.
Woher hast Du denn diese "Weisheiten"? Wie hoch ist Deine
Betriebsspannung überhaupt? Wieviel Strom fließt dann durch Deine LED?
Und welchen Strom gibt der Hersteller als absolutes Maximum vor?
Dafür, daß Du die letzten zwei Fragen mit ziemlicher Sicherheit nicht
beantworten kannst, bist Du Dir scheinbar ganz schön sicher, daß Du die
LED "ohne große Bedenken ohne Vorwiderstand anschließen" kannst!
Das hatte ich schon gesehen, danke! Sollte auch eher eine rethorische
Frage sein, immerhin ging Robert selbst schon von einer Flussspannung
der LED von 3-4V aus.
Ich kann ja noch irgendwie nachvollziehen, wenn ein unbedarfter
Bastelanfänger die Flussspannung mit einer Betriebsspannung verwechselt
und daher meint, diese "Betriebsspannung" ohne weitere Massnahmen direkt
an die LED anlegen zu können. Aber wie kommt man mit dem Wissen um 3 bis
4 V Flussspannung auf die Idee, daß man sie "ohne Bedenken" direkt an 5V
anschließen kann?
Es ist ja nun nicht gerade so, daß das Wissen über den korrekten
Anschluß von LEDs nur einem elitären Kreis von eingeweihten zugänglich
ist oder man erst teure Fachbücher lesen muss...
Da hast du ja noch einige Baustellen...
Das mit dem Video sieht schon ziemlich komisch aus, aber das kann ja an
allem Möglichen liegen:
-Überlastung des PIC durch die LED ohne Vorwiderstand (220 Ohm und die
Sache ist vom Tisch)
-Möglicherweise instabiler Takt(wirf mal einen Blick auf Kapitel 4 des
Datenblatts, da steht was zu Kondensatoren, Anschluss usw...)
-Da die LED ja sowieso an einem Eingang hängt werden da bis auf weiteres
auch keine besonders brauchbaren Dinge passieren.
-Abblockkondensator fehlt auch, das hat bei mir aber auch immer ohne auf
dem Steckbrett geklappt
Setze TRISA einfach mal 0, dann sind alle A-Ports auf Ausgang. Aber
vorher bau den Vorwiderstand ein, dein Port jetzt schon Glück, dass er
noch nicht abgeraucht ist...
Hey
ich bin dabei meine Fehler zu beseitigen.
Ich sehe ein, dass ich in Sachen LED Mist geschrieben habe.
Diese LED hät die USB Versorgungsspannung allerdings aus. Hatte sie 10
min ohne Vorwiderstand betrieben und sie leuchtet noch immer.
Hat aber nichts damit zu tun, dass da eigentlich ein Widerstand hin
gehört.
Ich bedanke mich für die vielen Hinweise auf meine Fehler. Habe nun alle
Beseitigt und das "Programm" läuft.
Was ich nicht gefunden habe ist eine Möglichkeit, diesen µC (pic16f54)
ohne Quarz zu betreiben. kann es sein, dass der das nicht kann? kann
bitte nochmal jemand von euch kontrollieren, ob ich mit der Annahme
recht habe?
Der kann das schon. Einfach mal ins das Datenblatt schauen:
#######################################
4.1
Oscillator Types
The PIC16F5X devices can be operated in four differ-
ent oscillator modes. The user can program two Con-
figuration bits (FOSC1:FOSC0) to select one of these
four modes:
• LP: Low-power Crystal
• XT: Crystal/Resonator
• HS: High-speed Crystal/Resonator
• RC: Resistor/Capacitor
#######################################
Guggschd du weider unner RC...
<edit> genau genommen ist natürlich auch ein Resonator kein Quarz.
So viel dann in Punkto Steinzeit-PICs ;-)
ich habe nur in dem Datenblatt nach infos gesucht:
http://ww1.microchip.com/downloads/en/DeviceDoc/41207D.pdf
ich wusste nicht das es auch ein anderes, umfangreiches Datenblatt zu
dem µC gibt.
ich habe mich wieder unsauber ausgedrückt. ich meinte nicht nur ohne
Quart sondern die Nutzung des Internen Oszillator. ich habe bei MPLAB
nach INTRC oder nach INTOSC beim Oszillator gesucht und da ich es nicht
gefunden habe, nahm ich an dass er es nicht kann.
Ja dein "Datenblatt" ist wohl nicht das richtige, sondern irgendwas was
anderes.
Auf jeden Fall hat dieses Teil (aus der Steinzeit ;-) keinen internen
Oszillator.
Erscheint natürlich im ersten Moment "sehr günstig", aber wenn man dann
noch eine externe Beschaltung für den Takt braucht, relativiert sich das
wohl wieder. Die Pins für die Beschaltung sind natürlich auch noch
futsch :-(
(Ich könnte ja jetzt noch einen Link zum "richtigen" Datasheet anfügen,
aber das sollte dann wohl auch ohne Hilfe zu schaffen sein)
<edit> Das soll jetzt alles nicht heissen, dass der 16f54 einfach nur
noch Müll ist. Damit kann man schon viel machen. Man sollte eben nur
nicht erwarten, dass er mit den aktuellen Controllern vergleichbar ist
und vergleichbare Features hat,
Robert,
was willst du eigentlich genau machen?
Einfach nur mit irgendeinem uC rumspielen, der gerade bei dir rum liegt,
oder hast du ein spezielles Vorhaben?
ja habe ich schon verstanden.
ich habe vor Jahren pic in Assembler beschrieben und lange Zeit gar
nichts mehr mit µC oder überhaupt mit Elektronik gemacht. jetzt fange
ich mit µC und C an und lerne erstmals auf dem, was ich noch am Material
habe.
Robert schrieb:> ja habe ich schon verstanden.> ich habe vor Jahren pic in Assembler beschrieben und lange Zeit gar> nichts mehr mit µC oder überhaupt mit Elektronik gemacht. jetzt fange> ich mit µC und C an und lerne erstmals auf dem, was ich noch am Material> habe.
Das Problem ist, dass sich in diesem Bereich alles wahnsinnig schnell
entwickelt und dann die oben liegenden Informationen beim googeln nicht
mehr so recht im Bezug zu Materialien von vor X Jahren stehen. Damit
kann man eigentlich immer noch gut arbeiten, aber man wird sehr leicht
in die Irre geleitet...
Robert schrieb:> ich habe nur in dem Datenblatt nach infos gesucht:> http://ww1.microchip.com/downloads/en/DeviceDoc/41207D.pdf
Das ist nicht das Datenblatt, sondern die "Memory Programming
Specification".
Im Datenblatt zum Controller steht als Überschrift dagegen "Data Sheet".
>> ich wusste nicht das es auch ein anderes, umfangreiches Datenblatt zu> dem µC gibt.
Das hier ist das Datenblatt:
http://ww1.microchip.com/downloads/en/DeviceDoc/41213D.pdf>> ich habe mich wieder unsauber ausgedrückt. ich meinte nicht nur ohne> Quart sondern die Nutzung des Internen Oszillator. ich habe bei MPLAB> nach INTRC oder nach INTOSC beim Oszillator gesucht und da ich es nicht> gefunden habe, nahm ich an dass er es nicht kann.
Der 16F54 hat tatsächlich keinen internen Oszillator! Du musst also
einen Quarz, Resonator, externen Oszillator oder eine RC-Kombination
anschließen.
Volker S. schrieb:> Das Problem ist, dass sich in diesem Bereich alles wahnsinnig schnell> entwickelt und dann die oben liegenden Informationen beim googeln nicht> mehr so recht im Bezug zu Materialien von vor X Jahren stehen.
Nimm es mir nicht uebel:
Aber fuer mich ist das reines Gequassel.
Der PIC16F54 ist alt insofern,als dass er nicht ueber die neuesten
Features verfuegt und das ist schon alles.
Laesst sich genauso einfach programmieren wie jeder andere
Piccy.Verfuegt ueber die gleichen Instruktionen und ist zu allem
Ueberdruss auch noch in Produktion:
http://www.microchip.com/wwwproducts/en/PIC16F54
Du scheinst ueber das noetige Wissen zu verfuegen und koenntest dem
Threadstarter - statt ihn aufzuziehen - innerhalb 1 Minute alle
notwendigen Informationen zukommen lassen.
Als Hobbyprogrammierer hier meine lowlevel Informationen fuer den TO:
1.Nimm einen 4MHZ Quarz und setze das entsprechende Configuration word
fuer einen XT oscillator:
FOSC0 = 1
FOSC1 = 0
Fuer andere Quarze siehe Seite 21 und 39 im Datenblatt
Wenn Du "delay" Funktionen einsetzt musst Du auch dies eingeben
2.#define _XTAL_FREQ 4000000 // gilt fuer 4MHz(dies ist auch
erforderlich fuer Pics mit internen Oscillatoren sofern "delay"
eingesetzt wird)
3.Es genuegt die xc.h per #include <xc.h> einzubinden
entferne die Zeile #include <pic16f54.h> (wird von Microchip nicht
empfohlen)
Ansonsten haelt sich dein Code ja in Grenzen.Watchdogtimer ist
deaktiviert.Der Rest scheint auch zu stimmen.Ich selbst habe keinen
PicKit-verwende seit Jahren den Sprut Minibrenner.Ist alt ich weiss -
dumm ist nur dass er funktioniert.....
Volker S. schrieb:> Robert,> was willst du eigentlich genau machen?> Einfach nur mit irgendeinem uC rumspielen, der gerade bei dir rum liegt,> oder hast du ein spezielles Vorhaben?
es haben sich über die Jahre hinweg viele Projekte angesammelt, die ich
mit µC lösen möchte.
das was ich gerade machen möchte ist eine Kinderküche. sie soll 2
Herdplatten haben und jede Platte hat 3 Stufen also HPA (Herdplatte A)
und HPB mit jeweils HAB 1, HAB 2, HAB 3. Skizze 1 (link ganz unten) ist
die Draufsicht auf die HP A und B.
man soll an den Drehreglern (DR) eine Stufe einstellen können. wenn z.b.
DRA auf 1 gestellt wird, sollen nach kurzer zeit die LED's HPA 1 langsam
potenziell heller werden. wenn DRA wieder auf 0 gedreht wird so sollen
die LED's von HPA1 wieder Exponentiell auf null geregelt werden. Skizze
2 zeigt ein Grafen von der Helligkeit der PHA1 über die zeit. natürlich
sollen sich die LED's von HPA (1..3) und HPB (1..3) genau gleich
verhalten und zwar unabhängig davon, ob gerade eine LED reihe beim
einschalten ist oder nicht.
ich sehe für die Realisierung mit µC mehre Wege.
Möglichkeit 1: Einfacher Prozessor Komplexes Programm
void EineLEDEinschalten( portDerLEDReihe,
aktuellerHelligkeitsStandDerLED){}
void ZweiLEDEinschalten( portDerErstenLEDReihe, portDerZweitenLEDReihe,
aktuelleHelligkeitErsteLEDReihe, aktuelleHelligkeitZweiteLEDReihe){}
void DreiLEDEinschalten ( ich denke das Prinzip ist klar) {}
void EineLEDAusschalten(){}
void ZweiLEDAusschalten[]{}
void DreiLEDAusschalten[]{}
void Wait0.5ms (){}
ja und die ISR oder die Main zu schreiben wird auch nicht einfach da sie
dort erkennen muss ob wir und gerade in ein lade oder Entladezustand
befinden und dann in die entsprechende Funktion springen. mehr als drei
LED Reihen auf einmal will ich nicht steuern. D.h.: wenn HPA1 = 1 danach
HPA2 = 1 und danach HPA3 = 1 Danach HPB1 = 1 passiert wird HPB1 warten,
bis HPA(1..3) fertig geladen sind (Skizze 3).
Möglichkeit 2: 6 einfache Prozessoren / Ein einfaches Programm
wie der Titel schon sagt: Jede LED reihe bekommt einen einfachen
günstigen Prozessor und der überwacht nur jeweils ein Eingang.
Möglichkeit 3: ein Prozessor mit Mulitithred oder Multiprozess
Möglichkeit / mittelkompleszes Programm
jeder Eingang und ausgang bekommt ein Thred oder Prozess. Die Ressource
Prozessor zur bereichung der Helligkeit wird dann vom µC gesteuert.
sodass das schwirige an diesem Programm nur die Erstellung der 6 Therese
oder Prozesse sind.
Neben diesen µC Möglichkeiten ist mir noch eine reine Analogtechnik
Lösung eingefallen:
Möglichkeit 4: Kondensatoren
6 Kondensatoren (und ein paar Widerstände) mit geringer
Spannungsaufnahme und hoher Kapazität verlangsamen das ein und
ausschalten der LED Reihen genau so, wie ich es gerne hätte. von den 4
Möglichkeiten die ich sehe ist das die Einfachste, vielleicht auch die
Günstigste.
Ich schreibe das hier nicht, weil ich Lösungsbeispiele haben möchte
sondern viel mehr eure Meinung dazu lesen möchte. Wie würden diese
Aufgabe erfahrende µC Programmierer lösen? ist meine Frage. Welche
Lösungsmöglichkeit habe ich Übersehen?
Skizzen:
https://dl.dropboxusercontent.com/u/88893402/2016-11-19%2011.53.24.jpghttps://dl.dropboxusercontent.com/u/88893402/2016-11-19%2011.53.36.jpg
und das ich die Helligkeit mit PWM regeln kann ist mir Bekannt. Bis
jetzt will ich das auch so machen.
Der 16F54 ist wirklich recht spartanisch.
Mit dem einen verfügbaren Timer könnte man eine kurze Periode
einstellen.
Die PWM für die LEDs könnte dann z.B. eine Periode von z.B. 32
Timerperioden haben die einfach durch gezählt werden. Die Leuchtstärke
ergibt sich aus einem Vergleichswert für jedes Element bei dem die LEDs
abgeschaltet werden.
Einschalten dann immer am Anfang der Periode.
Die langsame Änderung der Helligkeit könnte man über die Veränderung der
Vergleichswerte realisieren. In einer vielfachen der Timerperiode (noch
eine Zählervariable) werden dann die Vergleichswerte modifiziert, je
nachdem ob gerade ein Ein- oder Ausschaltvorgang stattfinden soll.
Wie sollen die Schalter aussehen? Codierschalter mit zwei Bit?
Ob das bei Verwendung eines C-Compilers und nur 25 Byte RAM überhaupt
machbar ist, müsste man erst mal austesten.
Möglichkeit 1 sehe ich auch ehr als gedankliches Experiment wie man
diese Aufgabe mit einem einfachen µC realisieren könnte.
Z.Z. gefällt mir die zweite Möglichkeit am besten. den billigsten µC den
ich bei 3 min Suchzeit gefunden habe ist der 10F200. In der PDIP
Ausführung 0,51 €. bei 6 Stück sind das 3,06€. ich denke da sind die
Kondensatoren für die Möglichkeit 4 teurer.
Bis zum 24.12 muss es fertig sein und es ist ja noch die Küche dazu zu
Bauen. exponentielles Wachstum mit PWM abzubilden ist für den Zeitrahmen
ein machbares Ziel für mich (denke ich).
Die Speicherkapazität von dem 16F54 habe ich bei der Möglichkeit 1
tatsächlich nicht bedacht.
Die Beschaffung des Drehreglers habe ich mir offen gelassen. Genau so
wie beim Echten Herd muss man ihn im Kreis drehen lassen können ( also
ich mein damit jetzt 360° + unendlich ). und die einzelnen Zustände
müssen einrasten, aber das ist ja ein mechanisches Problem.
Wenn ich euch wieder mit Quellcode nerven darf:
1
/*
2
* File: newmain.c
3
* Author: rob
4
*
5
* Created on 16. November 2016, 11:42
6
*/
7
8
/** I N C L U D E S **********************************************************/
Den Code habe ich von einem Buch abgeschrieben (also den der wait1ms
Funktion). Dem Compiler gefällt zum einen die if schleife und zum
anderen die zweite for Schleife nicht. Wenn ich in der zweiten for
Schleife ZAEL durch eine Konstante ersetze, dann läuft es (und den if
Teil auskommentiere).
Warum kann da keine Variable stehen?
Was ist an der if Schleife auszusetzen?
Robert schrieb:> Z.Z. gefällt mir die zweite Möglichkeit am besten. den billigsten µC den> ich bei 3 min Suchzeit gefunden habe ist der 10F200. In der PDIP> Ausführung 0,51 €. bei 6 Stück sind das 3,06€.
Warum nicht alles mit einem einzigen PIC machen?
Der kostet bestimmt weniger als 3€
Einer der aktuellen PIC16xxxx (4 oder 5 Ziffern hinter dem F) schafft
das bestimmt locker.
Oder ein 18F14K22, da könntest du dich an diesem Tutorial orientieren ->
http://pic-projekte.de/wordpress/?p=4242
<edit> Wolltest du die Schalter dann jeweils mit 3 Controllern
verbinden?
Das dann für alle LEDs erweitern.
Eine Auswertun ob die Schalter sich wie verändert haben wäre hier gar
nicht nötig. Einfach laufen lassen...
PS: Der letzte Kommentar ist nicht ganz vollständig. Die LEDs gehen
nicht an, wenn der Vergleichswert auch Null ist. (Dann gibt es ja kein
else)
Dein Drehschalter ist wirklich mächtig.
Wie wäre es mi so was?
https://m.reichelt.de/Drehschalter/DS-3/3/index.html?ACTION=3&GROUPID=7594&ARTICLE=7217
Ganz sicher bin mir allerdings nicht ob der durchgedreht werden kann...
Tutorial und kurz könntest du vielleicht mal den User Guide vom "PICkit
3 Starter Kit" anschauen.
Was laaaanges habe ich selber schon angefangen, aber dann etwas die Lust
verloren ob der weiteren Entwicklung der MCHP Compiler und Bibliotheken
:-(
Die Seite von Sprit ist sicher noch nicht unbrauchbar, verwendet (wie
mein eigenes Zeug auch) noch einen älteren Compiler.
Für den Einstieg entstehen da viele kleine Unstimmigkeiten, die einem
die Lust verderben können.
Selbst die Beschreibungen in den UserGuides der original MCHP Demo
Boards sind oft recht schnell nicht mehr aktuell und funktionieren
einfach nicht mehr.
Die von Toxic verlinkte Wiki-Seite durfte vermutlich noch am aktuellsten
sein, was C für uC angeht.
Zu der Frage nach dem Fehler im zuletzt gepostet en Code:
Müsste da "ul" für "unsigned long" stehen anstelle von u1 (100000u1)?
((auch wenn die Funktion an sich eigentlich unnütz ist, wie Toxic weiter
oben schon bemerkte))
Volker S. schrieb:> Müsste da "ul" für "unsigned long" stehen anstelle von u1 (100000u1)?
Korrekt! Das erklärt natürlich die daraus folgenden Compilerfehler
("misplaced constant" o.ä.) bei späterer Verwendung dieser
Textersetzung!
Bei manchen Fonts ist eine "1" aber auch echt schlecht von einem kleinen
"L" zu unterscheiden. Und wer rechnet beim Lesen eines C-Codes schon
damit, daß da jemand eine Konstante mit "ultra-eins" spezifiziert, statt
mit "ultra-long"...
Ich bedanke mich sehr für die Hilfe und für das Interesse an meinen
Projekt.
Ich habe den Code einfach gedankenlos abgeschrieben und habe mich nicht
gefragt, was u1 zu bedeuten hat. ich habe eine Exponentialdarstellung
vermutet aber wirklich darüber Nachgedacht habe ich nicht.Zu meiner
Verteidigung: Das kleine L und eine 1 sind bei der Schriftart wirklich
nicht zu unterscheiden. Beweisfoto ist der erste Link. (bei sehr genauer
Betrachtung gibt es da ein minimalen unterschied)
https://dl.dropboxusercontent.com/u/88893402/2016-11-20%2016.25.14.jpg
Da kleine Kinder sehr Dynamisch sind, und viele kleinen Kinder super
Dynamisch sind kann ich auf ein Drehregler aus Plastik verzichten, der
hält die Mechanische Belastung einfach nicht aus.
Mein vorgeschlagener DR ist mir ehrlich gesagt zu Teuer, zumal ich zwei
davon brauche. Ich habe daher entschieden selber welche zu Bauen.
Interessierte sehen sich bitte die Links an. Das Blech wird natürlich
auf der Rückseite eines Hölzernen Kreises befestigt.
https://dl.dropboxusercontent.com/u/88893402/2016-11-20%2016.25.27.jpghttps://dl.dropboxusercontent.com/u/88893402/2016-11-20%2016.25.40.jpghttps://dl.dropboxusercontent.com/u/88893402/2016-11-20%2016.25.49.jpghttps://dl.dropboxusercontent.com/u/88893402/2016-11-20%2016.25.57.jpg
@ Volker: Verstehe ich dich richtig, dass du die erste Möglichkeit
Favorisierst? Warum? der Aufbau des Codes ist total aufwendig und der
Finanzelle unterschied ist, wen überhaupt, sehr gering.
Ich bin mir mittlerweile fast sicher, dass ich die 6 kleinen µC nehme.
ich habe etwas über die Möglichkeit 4 gelesen und so einfach ist die
Schaltung gar nicht, wie ich es mir vorgestellt habe.
http://www.ledstyles.de/index.php/Thread/8721-LEDs-soft-einschalten-ausschalten/
Möglichkeit 3 habe ich auch ausgeschlossen, da es ja keine echte thred
oder Prozess Technologie bei µC von PIC gibt.
http://www.microchip.com/forums/fb.aspx?m=233317
(mein englisch ist nicht das beste doch das denke ich herrausgelesen zu
haben)
Aus diesem Chat
Robert schrieb:> Ich bin mir mittlerweile fast sicher, dass ich die 6 kleinen µC nehme.
Bedenke aber,dass diese kleinen Pics einen nur "2-Level Deep Hardware
Stack" haben.Das wird gern uebersehen und die Leute wundern sich warum
selbst einfachste Programme "abschmieren",weil sie eine Subsroutine nach
der anderen aufrufen.....
Volker S. schrieb:> So wie ich das sehe, habe ich praktisch schon den gesamten Code gepostet> ;-)> Keine Ahnung wofür man da so was wie Multi-Treading brauchen sollte.
dann scheine ich den Code nicht vollständig begriffen zu haben. ich
möchte das die einzelnen Bereiche einer Platte, nehmen wir jetzt HPA1,
in ca 10 sek voll aufgeladen sind. so wie ich das verstehe sollen die
DR mittels interrupt überwacht (ja ich weiß interrups können nichts
überwachen) werden und dann springen wir in LEDLangsamEinschalten(){}.
Wenn aber in den 10 s eine andere LED Reihe, z.B. HPA2 eingeschaltet
wird, wird durch die ISR der Ladevorgang von HPA1 unterbrochen, HPA2
wird voll geladen und danach der Ladevorgang von HPA1 zugeführt.
also so verstehe ich den code von dir.
Ich möchte aber die HP vollkommen unabhängig voneinander ein und
ausschalten können.
Die Drehregler werden einfach in dem langsamen IR abgefragt.
Der dürfte bei 8 Helligkeitsstufen dann ca. alle 1s kommen.
Abhängig von den Schalterstellungen werden die Vergleichswerte
geschoben.
Im selben IR! (Keine zusätzlichen Funktionen)
Bei Stellung 0 alle nach rechts, kleinere Werte (dunkler).
Bei 1, der innerste Ring nach links (heller), die anderen dunkler.
Bei 2, die beiden inneren Ringe heller...
Das Schieben bei voller Helligkeit oder Aus hat keine weitere Wirkung
mehr.
Obwohl geschoben wird bleibt der Wert gleich.
Das ist trotzdem alles unabhängig voneinander.
Man könnte vielleicht zwei uC nehmen. Für jede Platte einen. Drei PWM
Kanäle haben viele. Sollte aber auch mit Software-PWM gehen, wenn man
nicht all zu viele Stufen braucht.
Robert schrieb:> Für die Suche nach alternativen Schaltern bedanke ich mich
Hänge gerade mit ekligem Schnupfen daheim rum und langweile mich.
Nettes Projekt!
Toxic schrieb:> Bedenke aber,dass diese kleinen Pics einen nur "2-Level Deep Hardware> Stack" haben.
Ich würde hier zum PIC10F320 raten - der hat vergleichsweise reichlich
Speicher, Stack-Levels und nützliche Hardware an Board, mit der man
prima PWM-Signale erzeugen kann. Für ein einigermaßen gleichmäßiges
"Ausglühen" der Herdplatte, ohne deutliche Helligkeitssprünge, braucht
man nämlich eine sehr kurze und fein abstimmbare Einschaltdauer der
LEDs. Der NCO könnte dafür evtl. das richtige Werkzeug sein.
NCO ;-) Dafür, dass am Anfang ein 16F54 im Gepräch war sind wir jetzt
aber ganz schön modern. Nein im Ernst, 10F32x cooles Teil.
8(9) Stufen sind dem ein oder anderen vielleicht wirklich zu grob, auch
wenn ich das nicht so in Erinnerung habe. Der obige Code stammmt von
einem meiner Beispiele.
Bei 10Bit Hardware-PWM und ähnlichem Vorgehen wären die Übergänge vor
allem bei geringen Helligkeiten aber noch sanfter. Mit dem NCO natürlich
am perfektesten. (ein PIC mit genug PWM Modulen für eine HP wäre z.B.
der 16F1503)
Mit 3 CCP Modulen wie beim 16F18324 könnte man vermutlich mit etwas
Tricksen eine 16 Bit Auflösung erreichen.
(http://www.hs-ulm.de/users/vschilli/Mikrocontroller/uCQ/_downloads/uCquick-X.pdf
-> 7.1.3)
Volker S. schrieb:> ein PIC mit genug PWM Modulen für eine HP wäre z.B.> der 16F1503
stimmt - eigentlich würden die vier PWM-Module des '1503 sogar für zwei
Herdplatten reichen, und es wäre dabei sogar noch etwas
"originalgetreuer"!
In echt würde nämlich kein Herdplatten-Hersteller bei vier Stufen vier
verschiedene Heizelemente einbauen, sondern er baut davon zwei
verschiedene ein (A,B) und erreicht die vier Stufen durch schalten von
1) A+B in Serie, 2) A alleine, 3) B alleine, 4) A+B parallel.
habe begriffen was du meinst.
mann ich habe wirklich viel zu komplieziert gedacht. wir haben einfach
nur 6 funktionen, in der main wo der wert rückgeführt wird.
1
intHP(Schalter,alter_Wert){
2
3
intbeschläunigung=5// reguliert, wie schnell die Kurve ansteigt
4
intPWM_HellAnteil=0// gibt an wie lange der Hellanteil anhält
5
intMaximalwert=100// reguliert welchen Grenzwert die Kurve hat
6
7
if(schalter==1){
8
if(alter_Wert>=1000){//es gibt 1000 zustände zwischen aus und an
9
alter_Wert++;
10
}
11
}else{
12
if(alterwert!=0){//der schalter ist aus, die helligkeit wird auf null reduziert
//für sinkende werte muss eine andere Funktion rein
18
PWM_Regelung(PWM_HellAnteil,Maximalwert);
19
20
return(alter_wert)
21
}
22
23
main(){
24
25
alter_WertHPA1=HP(DRA1,Alter_Wert);
26
//das 6 mal wiederholt für die ein und ausgänge
27
28
}
das ist genial einfach. die Bemerkung mit den beiden Ringen hat bei mir
den Schalter umgelegt.
ich bevorzuge die exponential Funktion vor der Schiebefunktion da die
Exp. sich in beliebig viele schritte unterteilen lässt. somit bekomme
ich ein ganz sampfen anstieg an Helligkeit.
ich habe die Funktion mal in Exel "Simuliert". Interessierte können sich
dort die Mathematische Funktion ansehen.
https://dl.dropboxusercontent.com/u/88893402/kinderherd.ods
Volker S. schrieb:> Mit 3 CCP Modulen wie beim 16F18324 könnte man vermutlich mit etwas> Tricksen eine 16 Bit Auflösung erreichen.
Eine Erweiterung der PWM-Auflösung im kritischen Bereich (geringe
LED-Helligkeit) könnte man auch mit den 10-bit PWM-Modulen hinbekommen.
Man muss nur per ISR den PWM-Ausgang nach dem Impuls für z.B. 1 oder 3
(7, 15...) Timer-Perioden deaktivieren, um die Auflösung auf 11 oder 12
(13, 14...) Bit zu erhöhen. Die PWM-Frequenz verringert sich dann eben
entsprechend.
Robert schrieb:> ich bevorzuge die exponential Funktion vor der Schiebefunktion
und
> (e^(1/alter_Wert * beschläunigung);
das würdest Du in einen kleinen Mikrocontroller mit zwei Stackleveln, 16
Byte RAM und 256 Words Programmspeicher implementieren wollen?
Du hast hier keinen PC-Boliden mit 128-Bit Hardware FPU im Prozessor und
Linux unter den Fingern! Fließkomma-Arithmetik solltest Du vermeiden wo
es nur geht! Nimm 16-Bit Integer-Arithmetik, nimm davon die
höchstwertigen 10 Bits als LED-Wert und verwende die unteren 6 Bits für
interne Rechengenauigkeit.
ich mach die PWM im Code.
ich habe darüber schon gelesen das neue PIC dafür eingebaute HW haben,
doch für dieses Projekt mach ich das noch per Hand.
Habe ich früher in Assembler auch gemacht, hat mir nie große
Schwierigkeiten bereitet.
Ich bin jetzt wieder zuversichtlich für dieses Projekt keine neuen µC
kaufen zu müssen. Ich habe noch zwei unberührte 16f54 und zwei 16f872.
Robert schrieb:> Ich bin jetzt wieder zuversichtlich für dieses Projekt keine neuen µC> kaufen zu müssen. Ich habe noch zwei unberührte 16f54 und zwei 16f872.
Aber nicht mit Ausdrücken wie e^(1/x * y) - da wird es selbst in den
"üppigen" 2K Words Programmspeicher des 16f872 ganz schnell eng - wenn
Du wirklich mal etwas in 8-Bit PIC Assembler programmiert hast, solltest
Du ungefähr eine Vorstellung davon haben, welcher Programmaufwand für
die o.a. Formel notwendig wäre!
Thomas E. schrieb:> solltest> Du ungefähr eine Vorstellung davon haben, welcher Programmaufwand für> die o.a. Formel notwendig wäre!
Da MPLABX bei mir gerade laeuft,habe ich spasseshalber mal eine
Exponentialfunktion eingebunden.
Man beachte bitte links unten in den Bildern die graphische
Darstellung.Ueber 1KByte wird da verschwendet (ohne Optimierung-da
Freeversion...)
Der verwendete Pic ist ein 8-Beiner mit 4KByte Flash/.....
Ich verwende so gut wie nie komplexe mathematische Funktionen - Tabellen
tun's bei mir in den meisten Faellen.
C macht es einem sehr einfach mal den log von e^56 zu berechnen.Is ja
nur ne Zeile..... ;-)
Zum Anhang: 1.jpg ohne und 2.jpg mit Mathematik
So, aus reiner Neugier habe ich es mal eben ausprobiert (e^x muss in C
natürlich exp(x) lauten) - diese kleine Programm, im kostenlosen XC8
compiliert, füllt den Programmspeicher des 16F872 zu 95% aus! Für ein
zusätzliches "1/" im Exponenten reicht es schon nicht mehr...
Um erblich zu sein waren es auch nur 3 Projekte die ich zu Ende gebrächt
habe, und keins davon brauchte viel Mathe oder Speicherplatz. Das erste
war eine Ansteuerung von 4 led reihen, das zweite war ein elektrisches
schloss mit 9 Ziffern. Man musste 4 Ziffern in der richtigen Reihenfolge
drücken und dann schaltete ein transistor durch. Das letzte war ein
Voltmeter der den zustand des Akkus über 8 LEDs angezeigt.
Aber nein, auf die Nullstellen lege ich kein wert. Aber dafür gibt es
doch sicher Funktionen, um e^x einfach zu rechnen. Also so war meine
Hoffnung.
Toxic schrieb:> ....aber ich hab hab gewonnen - speed-wise :-)
Das war ja auch unfair - bei Dir war MPLAB-X schon am laufen, und ich
musste es erst starten! :P
@robert: vielleicht nimmst Du sowas in dieser Art:
1
#include<xc.h>
2
#include<stdint.h>
3
4
voidmain(void){
5
6
uint16_twert=0,zielwert=0xFFFF;
7
8
while(wert!=zielwert)
9
{
10
int16_tdiff=((int24_t)wert-zielwert)/64;
11
if(diff==0)// vermeidet, dass zielwert nie erreicht wird
12
diff=1;
13
wert-=diff;
14
}
15
}
wert nähert sich dabei wie bei einer e-Funktion zielwert an. Die
Geschwindigkeit wird durch die Wiederholrate in der Schleife und durch
den Teilerfaktor bestimmt (hier 64, 2er-Potenzen ergeben hier
effektiveren Code). Es funktioniert in beide Richtungen, also egal ob
zielwert größer oder kleiner als wert ist.
Robert schrieb:> habe begriffen was du meinst.> mann ich habe wirklich viel zu komplieziert gedacht. wir haben einfach> nur 6 funktionen, in der main wo der wert rückgeführt wird.
Also eigentlich hatte ich in meiner Primitv-Version gar keine
zusätzlichen Funktionen und auch in main() wird nach der Initialisierung
gar nichts mehr gemacht.
Das ganze ist durch das schieben auch exponentiell (der
Helligkeitseindruck dadurch etwa linear).
Vielleicht schreibst du dir mal eine kleines Testprogramm das
verschiedene Helligkeitsstufen durchläuft und schaust dir das Resultat
an einer LED an, bevor du weiter planst.
So einen primitive Controller wie den 16F54 habe ich noch nie benutzt.
Da kann man ja nicht mal auf einfache Weise kontrollieren, ob der Timer
übergelaufen ist. (oder ich blick's einfach nicht ;-)
Mein erster PIC war der 16C74
Robert schrieb:> ich mach die PWM im Code.> ich habe darüber schon gelesen das neue PIC dafür eingebaute HW haben...
Also wenn ich einen uC benutze, dann im Wissen, dass viele
Problemlösungen schon in der Hardware realisiert sind. Ich suche dann
zuerst das Modul, elches für die Problemstellung am besten geeignet ist.
Die Software dient dann oft "nur" dazu, die Module zu konfigurieren und
das Zusammenspiel zu organisieren. Das sind völlig verschiedene
Herangehensweisen.
Aus meiner beruflichen Erfahrung als Laboring. an einer Hochschule weiß
ich aber, dass sich Leute die nicht mit Hardware sondern Software groß
geworden (im Sinne von aufgewachsen) sind, damit enorm schwertun...
Thomas E. schrieb:> füllt den Programmspeicher des 16F872 zu 95% aus! Für ein> zusätzliches "1/" im Exponenten reicht es schon nicht mehr...
mit welchen Tool bist du auf die 95% gekommen und kennst du eine
deutsche Anleitung für das Tool?
Volker S. schrieb:> Also wenn ich einen uC benutze, dann im Wissen, dass viele> Problemlösungen schon in der Hardware realisiert sind. Ich suche dann> zuerst das Modul, elches für die Problemstellung am besten geeignet ist.> Die Software dient dann oft "nur" dazu, die Module zu konfigurieren und> das Zusammenspiel zu organisieren. Das sind völlig verschiedene> Herangehensweisen.
Danke, ich werde es mir merken und meine Herangehensweise für µC ändern.
Volker S. schrieb:> So einen primitive Controller wie den 16F54
wie erkenne ich den die Schlichtheit eines PIC µC? muss ich dafür das
Datenblatt lesen? anders gefragt: wofür steht die 54 beim 16f54? die 16
war, soweit ich mich erinnere die Busbreite, und das f steht für den
flash Speichertype.
Volker S. schrieb:> Das ganze ist durch das schieben auch exponentiell (der> Helligkeitseindruck dadurch etwa linear).
ja ist es, doch ist mir die schrittweise zu groß, daher eine e funktion.
Thomas E. schrieb:> Das war ja auch unfair - bei Dir war MPLAB-X schon am laufen, und ich> musste es erst starten! :P
um diesen teil der Diskussion auch zu Kommentieren: ich empfinde
Fairniss nur als gedankliches Konstrukt um schwachen das Jammern zu
erschweren. Ich sehe in der Natur, unser Soziales Leben wie auch ein
Wettkampf zwischen ähnlichen Kontrahenten immer große Unfairness, oder,
um es anders auszudrücken, die Abwesenheit von Gerechtigkeit.
Einer ist immer schneller, stärker oder klüger als der andere oder hat
einfach bessere Startbedingungen. Das ändert nichts an der Sache das wir
uns Ständig miteinander vergleichen und messen wollen. Sei es ein
Wettregen von Gepard und Antilope oder das Schreiben einer Arbeit von
zwei unterschiedlichen Schülern. Einer ist immer Besser und daraus
folgt: Das der andere unterliegen wird. Damit es ein Spannender
Wettkampf ist jagt ein Gepard und frisst z.b. kein schon liegenden
Kadaver. Eine Klassenarbeit wird immer unter ungefähr gleichaltrigen
Schülern geschrieben.
wirklich fair ist ein Wettkampf nie.
Daher kann man sich lange über gleiche Startbedingungen, gleiche
stärken, gleiche schwächen u.s.w. unterhalten und dann entscheiden: ja
die Kontrahenten sind sich ausreichend ähnlich, um es ein fairen
Wettkampf zu nennen.
Alternativ kann man akzeptieren das es keine zwei gleichen Lebewesen
gibt die sich fair miteinander messen können und gespannt zusehen,
welche Strategie der eine und der andere aufbaut, um seine stärken und
die schwächen des Kontrahenten auszunutzen und zu gewinnen.
verspätetes Wort zum Sonntag: Ende.
Robert schrieb:> wie erkenne ich den die Schlichtheit eines PIC µC? muss ich dafür das> Datenblatt lesen? anders gefragt: wofür steht die 54 beim 16f54? die 16> war, soweit ich mich erinnere die Busbreite, und das f steht für den> flash Speichertype.
Mit PIC16 hatte ich jetzt länger nicht zu tun. Seit vermutlich einiges
mehr als 10 Jahren fast nur PIC18. Deshalb kann ich dich nur auf Sprut
verweisen, der eine kleine Aufstellung gemacht hat:
http://www.presseagentur.com/maxim/detail.php?pr_id=4455&lang=de
Da gibt es auch eine PIC18 Übersicht, bei der meiner Meinung nach die
Nummerierung mehr Rückschlüsse zulässt.
Datenblatt lesen ist natürlich nützlich, aber gewöhnlich gehe ich
andersherum vor weil es viel zu viele PICs gibt.
Ich überlege mir welche Peripherie-Module ich brauche und dann suche ich
z.B. mit MAPS (http://www.microchip.com/maps/microcontroller.aspx) den
kleinsten (und günstigsten) Controller der das bietet.
Auch wenn irgendwo noch ein paar ältere Teile rumliegen lohnt es sich
meiner Meinung nach eher selten die aufzubrauchen. Die Neuen sind meist
viel besser und billiger, wenn man dann doch noch was nachkaufen müsste.
Zudem werden sie natürlich auch besser von aktuellen Tools unterstützt.
Robert schrieb:> Volker S. schrieb:>> Das ganze ist durch das schieben auch exponentiell (der>> Helligkeitseindruck dadurch etwa linear).>> ja ist es, doch ist mir die schrittweise zu groß, daher eine e funktion.
Wie schon gesagt, einfach mal ausprobieren. Das Problem sind eigentlich
nur die kleinen Werte. Von Null nach eins ist ein sehr großer
Unterschied in der Wahrnehmung und von eins nach zwei auch noch, dann
werden die Wahrnehmungsstufen immer kleiner. Das kann man nur durch
höhere Auflösung verbessern und nicht durch komplizierte Formeln.
Ich bin mit der Funktionalität meines Programms ganz zufrieden. Habe das
Laden bis jetzt nur Linear gestaltet und wahrscheinlich lasse ich es
auch so um auf dem 16F54 zu bleiben.
if(eingang){// Wenn Schalter 1 dann wert erhohen, wenn schalter 0 dann verringern
28
if(alter_Wert<255){
29
alter_Wert++;
30
}
31
}else{
32
if(alter_Wert>0){
33
alter_Wert--;
34
}
35
}
36
37
//PWM
38
RA3=1;//hier möchte ich die Variable "ausgang" schreiben
39
for(j=0;j<alter_Wert;j++){
40
// __delay_ms(1);
41
// warte05ms();
42
}
43
RA3=0;//hier auch
44
for(j=0;j<(255-alter_Wert);j++){
45
// __delay_ms(1);
46
// warte05ms();
47
}
48
__delay_ms(10);
49
returnalter_Wert;
50
}
51
52
53
voidmain(void)
54
{
55
TRISA=0x00;//Ausgang
56
TRISB=0XFF;//Eingang
57
58
unsignedcharalter_WertHPA1=0;
59
unsignedcharalter_WertHPA2=0;
60
unsignedcharalter_WertHPA3=0;
61
unsignedcharalter_WertHPB1=0;
62
unsignedcharalter_WertHPB2=0;
63
unsignedcharalter_WertHPB3=0;
64
65
while(1)
66
{
67
// alter_WertHPA1 = HP (alter_WertHPA1);
68
// alter_WertHPA2 = HP (alter_WertHPA2);
69
alter_WertHPA3=HP(RB3,RA3,alter_WertHPA3);
70
71
// alter_WertHPB1 = HP (alter_WertHPB1);
72
// alter_WertHPB2 = HP (alter_WertHPB2);
73
// alter_WertHPB3 = HP (alter_WertHPB3);
74
}//end while
75
return;
76
}//end main
Wie im Code markiert möchte ich das entsprechende Ausgangsbit von der
Main an die Funktion weiterleiten, um die Funktion für alle HP nutzen zu
können.
Warum geht das bei der Variabel "eingang" und nicht bei der Variabel
"ausgang"
Robert schrieb:> Wie im Code markiert möchte ich das entsprechende Ausgangsbit von der> Main an die Funktion weiterleiten...
Das geht nicht ;-)
C kennt keine Bit-Typen. Da musst du wohl ein switch/case einbauen.
Warum willst du überhaupt eine Funktion, die du dann mehrmals aufrufst.
Weil es so schön objektorientiert oder sowas ist ?
Schon der Aufruf einer Funktion bringt es bei so einem winzigen Programm
gar nicht. Vergiss den ganzen Stuss und schreib das Ding einfach runter.
Robert schrieb:> Warum geht das bei der Variabel "eingang" und nicht bei der Variabel> "ausgang"
Das geht weder für "eingang", noch für "ausgang". Falls Du evtl. eine
Fehlermeldung des Compilers nur für "ausgang" bekommst, heißt das ja
noch nicht, daß es tatsächlich so für "eingang" funktioniert.
Die Port-Pins kannst Du zwar nicht an eine Funktion übergeben, wohl aber
z.B. die Bitnummer oder eine Bitmaske. Wenn alle Schalter z.B. am Port B
angeschlossen sind und alle LEDs an Port A, muss ja der Port selbst (ob
A oder B) nicht mit übergeben werden.
Im übrigen hat Volker auch Recht, daß es bestimmt einfacher ist, die 6
Schalter und deren Auswirkungen in der main-Schleife direkt zu
verarbeiten. Was Du aber sicher in eine extra Funktion packen musst, ist
Deine PWM-Erzeugung, und zwar in einer Interrupt Service Routine - wie
willst Du sonst die Herdplatten unabhängig voneinander ansteuern?
P.S.: Was gefällt Dir nicht an meiner Erzeugung der "Lade-/Entlade
e-Funktion" (Beitrag "Re: PICKIT3 und pic16f54 in c Einfches Program scheitern beim Brennen")? Der
Code dort dient nur als Beispiel, wie der Algorithmus funktioniert.
Daraus könnte man leicht eine Funktion machen, die die Helligkeitswerte
der einzelnen LEDs anpasst:
1
uint16_tLEDwert[6];// Helligkeit für 6 Kanäle, Wert in den oberen Bits!
2
3
4
voidWertAnpassung(uint8_tKanal,uint8_tZiel)
5
{
6
uint16_tziel16=Ziel<<8;
7
int16_tdiff=((int24_t)LEDwert[Kanal]-ziel16)/64;
8
9
if((LEDwert[Kanal]>>8)!=Ziel)// Ziel noch nicht erreicht:
10
{
11
if(diff==0)// vermeidet, dass Ziel nie erreicht wird
Thomas E. schrieb:> Was gefällt Dir nicht an meiner Erzeugung der "Lade-/Entlade> e-Funktion"
also ich habe erstmals linear angefangen, um irgendwas zu haben, mit dem
ich arbeiten kann. finde es erst mal so ganz ok und um ehrlich zu sein,
ich hatte mit Schiebeoperatoren nie viel zu tun, daher versteh ich die
Funktion nicht zu 100%. Dass ist der eigentliche Grund, warum ich sie
nicht eingebaut habe. Meine Aktuelle Lösung sieht so aus:
if(!(Zyklen-alter_WertHPA3)){//um die volle leuchtkraft der LED's gegen ende der Ladekurve zu nutzen
82
RA3=1;
83
}
84
85
86
}//end while
87
return;
88
}//end main
die drei LED's gehen ohne flackern langsam an und aus. gegen ende des
Einschaltens gibt es dann halt noch ein extra hub, um die volle
Leuchtkraft der LED's zu nutzen. ohne die Zusätzliche if Bedingung
bleibt die LED für den rest des Programdurchlaufs Aus. wenn ich RAX = 0;
in die dunkel-for schleife rein packe, so gibt es den hub gleich beim
einschalten der LED, und das sieht schlecht aus.
Thomas E. schrieb:> Das geht weder für "eingang", noch für "ausgang". Falls Du evtl. eine> Fehlermeldung des Compilers nur für "ausgang" bekommst, heißt das ja> noch nicht, daß es tatsächlich so für "eingang" funktioniert.
also der code funktioniert so. auch als die Funktion Eingang und
Augsangsbit bekommen hat, hat der compiler nicht gemeckert. gibt ja auch
kein grund. wenn ich ein und ausgang bit einer funktion übergebe,
übergebe ich ja nur die Kopie der entsprechenden werte. beim eingang
macht es nichts, da die kopie nur gelesen wird. beim schreiben auf den
ausgang in der funktion gibt es auch kein Compilerfehler, daich ja nur
in die Kopie schreibe, der Orginale wert bekommt ja davon nichts mit.
ich habe es kurz mit zeigern versucht, hat aber auf die schnelle nicht
geklappt.
ich bin mit dem aktuellen code zufrieden. er ist nicht super, aber er
macht im groben, dass was ich will. wenn ich mehr zeit habe, dann
optimierter ich den Code, so wie es mir passt. wichtig ist zur zeit, das
din in weniger als 30 Tagen fertig zu bekommen.
und die ganzen anderen Verpflichtungen nicht schleifen zu lassen.
Volker S. schrieb:> Weil es so schön objektorientiert oder sowas ist ?
ein Programm in Funktionen aufzuteilen hat nichts mit OOP zu tun. es
dient der besseren Lesbarkeit und der einfachen Wiederverwendbarkeit,
von Programmcode.
Hallo Robert,
herzlichen Glückwunsch! Auf die Idee, die PWM-Impulse einfach
nacheinander zu erzeugen, wäre ich im Leben nicht gekommen! ;)
Naja, ein Helligkeitssprung von ca. 30% auf 100% ist ja auch nur ein
"kleiner" Schönheitsfehler. Ein möglicher Ansatz ohne Sprung wäre
vielleicht, auf die 100%-Abfrage zu verzichten und die LEDs eben einfach
nur mit max. Duty = 30% zu betreiben und ggf. den Strom zu erhöhen, um
die gewünschte Helligkeit zu erreichen. Obwohl: wenn ich mir die
glühenden Heizelemente in meinem Ceranfeld so angucke, blendet mich die
Helligkeit nicht so, als daß man da für eine Simulation LEDs mit 100%
möglicher Lichtleistung bräuchte...
Anderer Ansatz:
Wenn Du schon keinen Timer+ISR verwenden willst, könntest Du ja
wenigstens die 3 PWM-Signale in einer gemeinsamen Schleife erzeugen.
Rob W. schrieb:> also der code funktioniert so.
Ok, Du hast Recht: beim Eingang funktioniert es hier deshalb, weil an
die Funktion als Parameter nicht ein Verweis an den Pin übergeben wird,
sondern der aktuelle Datenwert am Pin als Zahl (0 ider 1). Wenn der
Parameter in der Funktion nicht "eingang", sondern z.B. "eingangswert"
benannt wäre, wäre dieser Zusammenhang leichter zu sehen.
Apropos Lesbarkeit:
statt "if(!(A - B))" wäre "if(A == B)" eindeutig klarer verständlich.
Thomas E. schrieb:> Apropos Lesbarkeit:> statt "if(!(A - B))" wäre "if(A == B)" eindeutig klarer verständlich.
ja stimme ich voll und ganz zu. if(!(A-B) war mein erster Gedankengang
als ich über das Problem nachdachte, daher die schräge Ausdrucksweise.
Thomas E. schrieb:> Wenn Du schon keinen Timer+ISR verwenden willst, könntest Du ja> wenigstens die 3 PWM-Signale in einer gemeinsamen Schleife erzeugen.
ja ich habe das wie von Volker empfohlen mit switch, in einem Anderen
Projekt (also der gleiche Code, nur halt in der IDE ein neues Projekt)
ausprobiert, und es ist etwas schlechter b zu lesen, aber die
Funktionalität ist ein und die selbe. Daher bin ich bei dem Code
geblieben.
Thomas E. schrieb:> herzlichen Glückwunsch! Auf die Idee, die PWM-Impulse einfach> nacheinander zu erzeugen, wäre ich im Leben nicht gekommen! ;)
ich danke, das ist das, was ich vor paar tagen als Genial markiert habe.
Thomas E. schrieb:> Naja, ein Helligkeitssprung von ca. 30% auf 100% ist ja auch nur ein> "kleiner" Schönheitsfehler.
ob ich es so lasse weiß ich noch nicht. ich habe beide Funktionen in der
Ausführung meiner Frau (also ich habe ihr langsam an und ausgehende
LED's) gezeigt, und sie meinte, das es die Kinder sicher interessanter
finden, wenn es am ende so ein "plop" gibt... fand ich überzeugend.
Hier ist ein netter Artikel,wie man generell PWM per Software einfach
realisieren kann.In der Application Note AN1074 von Microchip wird dies
an einem Beispiel mit 3 PWM-Signalen demonstriert
http://www.microchip.com/wwwAppNotes/AppNotes.aspx?appnote=en524189
Interessant(so glaube ich zumindest) fuer lernwillige Newbies.
Naja - mit Timer, Interrupt und in Assembler wie in der Appnote ist das
PWM-Timing ja keine Kunst!
Hab eben mal ein wenig getüftelt und eine Version in C und ohne Timer
probiert. Ist aber nur oberflächlich im Simulator getestet...
ich habe das gefühl dieses Projekt ist am Ende angekommen.
Ich lade alle, die sich für meine Probleme Interessieren, auf mein neuen
Artikel ein.
Beitrag "Re: Intigrierer Übertragungsfunktion Systemtheorie Reglungstechnik"
Des weiteren möchte ich mich nochmal für die schnelle Hilfe Bedanken.
Der Dialog mit euch hat das Projekt sehr angetrieben sodass ich in
kurzer Zeit viel neues Über PIC µC lernen konnte und schnell zum Ziel
gekommen bin.
Da dieses Projekt so erfolgreich war, werde ich mich auf der Seite öfter
herumtreiben und meine Ideen Präsentieren.
Ich werde mich über eure Anregungen und Kommentare Freuen.
Rob W. schrieb:> habe ich bei der PWM ein Fehler gemacht?
Keine Ahnung - hab nicht alle postings gelesen und kritisiert habe ich
auch niemanden.Habe lediglich Zusatzinformationen gegeben.
Danke für's Video - freut mich, daß es wenigstens im Ansatz halbwegs
funktioniert!
Ich denke, daß ich den Fehler, warum es nicht ganz ausgeht, schon
gefunden habe! In der WertAnpassung-Funktion passt die if-Bedingung
nicht:
1
if((PWMwert[Kanal]>>8)!=Ziel)// Ziel noch nicht erreicht:
Da werden nur die oberen 8 Bits (Bits 8..16) vom PWM-Wert verglichen,
aber die PWM-Routine arbeitet mit einer höheren Auflösung (9 Bit, im
ganz unteren Bereich sogar feiner!).
Mit Änderung der Zeile auf:
1
if(PWMwert[Kanal]!=ziel16)// Ziel noch nicht erreicht:
sollte es passen!
Kannst vielleicht auch mal "Zyklen" kleiner machen, damit steigt die
PWM-Frequenz und das Flackern wird weniger.
Hey leute
wir haben ja lange nichts mehr voneinander gehört.
ich habe ein neues Projekt und möchte mit den alten Läuten schreiben,
daher führe ich das hier einfach weiter.
Ich habe jetzt ein pic18F14K22 und möchte am ende ein BLCD Motor mit
Hall sensoren zum drehen bringen.
Ich habe den Motor noch nicht. ICh will mit dem Auslesen der Hall -
Sensoren beginnen und dafür brauche ich ein Program, welches ein
Analogen Zerro - crossing erkennen kann.
Mein plan ist die spannung anzuheben, sodass ich keine negative spannung
habe, sondern mich in den bereich 0 - 5 V bewege und dann erkenne, wann
der analoge Wert die 2,5 V schneidet.
Könnt ihr mir mal bitte ein Beispiel dafür geben, wie ich mit c ein
Analoges signal erkenne? aus diesem hier:
https://github.com/PIC-Nico/StartPIC18/tree/master/Analogmessung werde
ich nicht wirklich schlau.
Es reicht mir auch vollkommen, wenn mir jemaand in diesem Beispiel
zeigen kann, wo ich welches Analoges Signal lese.
Grüße:
Robert
Rob W. schrieb:> Mein plan ist die spannung anzuheben, sodass ich keine negative spannung> habe, sondern mich in den bereich 0 - 5 V bewege und dann erkenne, wann> der analoge Wert die 2,5 V schneidet.
Bist du sicher, das das mit dem ADC besser geht als mit dem Komparator
Unit? Der Komparator macht die Vergleicherei selber und du bestimmst mit
der Referenzauswahl, bei welcher Schwelle der Komparator kippt.
Das alles ist allerdings wirklich nur nötig, wenn du analoge Hallsensoen
benutzt, moderne Motoren enthalten meistens welche, die direkt ein
Digitalsignal liefern.
Da ich die Motoren noch nicht habe weiß ich es nicht ob sie digitalen
oder analogen ausgang haben.
Kann mir mal bitte einer erklären, warum ich die LED nicht zum leuchten
bekomme?
1
/*
2
* File: newmain.c
3
* Author: rob
4
*
5
* Created on 7. April 2017, 10:26
6
*/
7
8
9
10
// PIC18F14K22 Configuration Bit Settings
11
12
// 'C' source line config statements
13
14
// CONFIG1H
15
#pragma config FOSC = IRCCLKOUT // Oscillator Selection bits (Internal RC oscillator, CLKOUT function on OSC2)
16
#pragma config PLLEN = OFF // 4 X PLL Enable bit (PLL is under software control)
17
#pragma config PCLKEN = ON // Primary Clock Enable bit (Primary clock enabled)
#pragma config HFOFST = ON // HFINTOSC Fast Start-up bit (HFINTOSC starts clocking the CPU without waiting for the oscillator to stablize.)
32
#pragma config MCLRE = ON // MCLR Pin Enable bit (MCLR pin enabled, RA3 input pin disabled)
33
34
// CONFIG4L
35
#pragma config STVREN = ON // Stack Full/Underflow Reset Enable bit (Stack full/underflow will cause Reset)
36
#pragma config LVP = ON // Single-Supply ICSP Enable bit (Single-Supply ICSP enabled)
37
#pragma config BBSIZ = OFF // Boot Block Size Select bit (1kW boot block size)
38
#pragma config XINST = OFF // Extended Instruction Set Enable bit (Instruction set extension and Indexed Addressing mode disabled (Legacy mode))
39
40
// CONFIG5L
41
#pragma config CP0 = OFF // Code Protection bit (Block 0 not code-protected)
42
#pragma config CP1 = OFF // Code Protection bit (Block 1 not code-protected)
43
44
// CONFIG5H
45
#pragma config CPB = OFF // Boot Block Code Protection bit (Boot block not code-protected)
46
#pragma config CPD = OFF // Data EEPROM Code Protection bit (Data EEPROM not code-protected)
47
48
// CONFIG6L
49
#pragma config WRT0 = OFF // Write Protection bit (Block 0 not write-protected)
50
#pragma config WRT1 = OFF // Write Protection bit (Block 1 not write-protected)
51
52
// CONFIG6H
53
#pragma config WRTC = OFF // Configuration Register Write Protection bit (Configuration registers not write-protected)
54
#pragma config WRTB = OFF // Boot Block Write Protection bit (Boot block not write-protected)
55
#pragma config WRTD = OFF // Data EEPROM Write Protection bit (Data EEPROM not write-protected)
56
57
// CONFIG7L
58
#pragma config EBTR0 = OFF // Table Read Protection bit (Block 0 not protected from table reads executed in other blocks)
59
#pragma config EBTR1 = OFF // Table Read Protection bit (Block 1 not protected from table reads executed in other blocks)
60
61
// CONFIG7H
62
#pragma config EBTRB = OFF // Boot Block Table Read Protection bit (Boot block not protected from table reads executed in other blocks)
63
64
// #pragma config statements should precede project file includes.
65
// Use project enums instead of #define for ON and OFF.
66
67
#include<xc.h>
68
//#define _XTAL_FREQ 2000000
69
70
voidmain(){
71
72
TRISA=0xFF;//Eingang
73
TRISB=0X00;//Ausgang
74
while(1){
75
RB7=1;
76
}
77
78
}
ich habe das Gefühl, dass ich irgendwas vergessen habe, doch ich komm
nicht drauf, was es war.
ich kann das Programm auf den Pic brennen, doch dieser lässt die LED
nicht leuchten. ich habe das Gefühl, dass ich den internen CLock nicht
richtig eingestellt habe. stimmt das? und wenn ja, wie mach ich es
richtig?
Rob W. schrieb:> ich habe das Gefühl, dass ich den internen CLock nicht> richtig eingestellt habe. stimmt das? und wenn ja, wie mach ich es> richtig?
Wenn du im Debug Mode bist, dann bekommst du sofort eine Fehlermeldung,
wenn der PIC nicht läuft. Wenn du nicht im Debug-Mode bist - warum
nicht?
RB7 = 1; -> LATBbits.LATB7 = 1;
sorry die LED leuchtet immer noch nicht.
hat jemand die Oszillator Einstellungen überprüft und als richtig
empfunden? wie kann ich den den internen Oszillator auf 16 MHz laufen
lassen? im Datenblatt steht, dass man es kann und die Bit Einstellung
habe ich auch gefunden aber muss ich das als bitcode in das
entsprechende Register schreiben?
1
/*
2
* File: newmain.c
3
* Author: rob
4
*
5
* Created on 7. April 2017, 10:26
6
*/
7
8
9
10
11
// PIC18F14K22 Configuration Bit Settings
12
13
// 'C' source line config statements
14
15
// CONFIG1H
16
#pragma config FOSC = IRCCLKOUT // Oscillator Selection bits (Internal RC oscillator, CLKOUT function on OSC2)
17
#pragma config PLLEN = OFF // 4 X PLL Enable bit (PLL is under software control)
18
#pragma config PCLKEN = ON // Primary Clock Enable bit (Primary clock enabled)
Danke
ich habe das wieder verwechselt.
und warum geht das wieder nicht:
1
voidunterprogram(){
2
RB7=!RB7;
3
}
4
5
voidmain(){
6
7
TRISA=0xFF;//Eingang
8
TRISB=0X00;//Ausgang
9
TRISC=0xFF;//Eingang
10
11
RB7=0;
12
13
while(1){
14
if(RC0==1){
15
unterprogram();
16
}
17
}
also das 'Unterprogramm' kann die LED jetzt an und aus knipsen doch der
Eingang wird nicht erkannt.
ich kann auch schreiben: if(RC0).
RC0 ist am Pin 16 und mit einem 7k4 auf Masse gezogen. mit einem
einfachen Draht an die positive Spannung bewirke ich nicht, dass die if
Bedingung erfüllt ist.
und das entprellten können wir uns erstmals schenken, da ich es im Debug
Modus betreibe.
ich brauch halt wieder ein paar hilfen um wieder in das Thema rein zu
kommen. November ist ja auch schon etwas her.
Zumindest die Analogfunktion muss abgeschaltet werden, sonst ließt der
immer 0.
rob wod schrieb:> ich brauch halt wieder ein paar hilfen um wieder in das Thema rein zu> kommen.
Die beste Hilfe ist das Datasheet ;-)