Forum: Mikrocontroller und Digitale Elektronik PICKIT3 und pic16f54 in c Einfches Program scheitern beim Brennen


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Robert (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
hey hier Robert.
Ich versuche mit dem PICKIT 3 ein pic16f54 in C zu Programieren. Der 
Code soll nur eine Einzige LED an RA1 einschalten:
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 **********************************************************/
9
10
#include <xc.h>
11
#include <pic16f54.h> 
12
13
/** Configuration ********************************************************/
14
#pragma config OSC = HS   //CPU=20 MHz
15
//#pragma config PWRT = ON
16
//#pragma config BOR = OFF
17
#pragma config WDT = OFF  //Watchdog Timer
18
//#pragma config LVP = OFF  //Low Voltage ICSP
19
 
20
21
/** D E C L A R A T I O N S **************************************************/
22
//#pragma code
23
void main(void)
24
{
25
  RA1 = 0x00; 
26
  TRISA = 0xFE;
27
28
  while(1)
29
  {
30
    RA1 = 1;
31
/*    __delay_ms(100);
32
    RA1 = 0;
33
    __delay_ms(100);  */
34
  }//end while
35
  return;
36
}//end main

Das Build funktioniert. Beim laden auf den Chip kommt es aber zum 
Fehler:
1
*****************************************************
2
3
Connecting to MPLAB PICkit 3...
4
5
Currently loaded firmware on PICkit 3
6
Firmware Suite Version.....01.45.41
7
Firmware type..............Baseline
8
9
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.

von Nico .. (nico123)


Bewertung
0 lesenswert
nicht lesenswert
Der Programmer erkennt den PIC nicht!
Hast Du ein Schaltplan und ein Foto vom Aufbau?
Der Pullup am MCLR muss übrigens auf VDD und nicht VPP!

von Andreas H. (ahz)


Bewertung
0 lesenswert
nicht lesenswert
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

von Robert (Gast)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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

von Karsten (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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

von Thomas E. (picalic)


Bewertung
0 lesenswert
nicht lesenswert
... und auf jeden Fall gehört direkt am µC ein Abblock-Kondensator 
zwischen VDD und VSS!

von Witkatz :. (wit)


Bewertung
0 lesenswert
nicht lesenswert
Robert schrieb:
> 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.

von Robert (Gast)


Bewertung
0 lesenswert
nicht lesenswert
>> 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
void main(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.

von Volker S. (vloki)


Bewertung
0 lesenswert
nicht lesenswert
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 ;-))

: Bearbeitet durch User
von Robert (Gast)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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 **********************************************************/
9
10
#include <xc.h>
11
#include <pic16f54.h> 
12
13
/** Configuration ********************************************************/
14
#pragma config OSC = HS   //CPU=20 MHz
15
//#pragma config PWRT = ON
16
//#pragma config BOR = OFF
17
#pragma config WDT = OFF  //Watchdog Timer
18
//#pragma config LVP = OFF  //Low Voltage ICSP
19
 
20
21
/** D E C L A R A T I O N S **************************************************/
22
//#pragma code
23
void main(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.

von Robert (Gast)


Bewertung
0 lesenswert
nicht lesenswert
der Quarz hat 4 MHz

von Volker S. (vloki)


Bewertung
1 lesenswert
nicht lesenswert
Wie soll bei diesem Programm was blinken? Ich bitte um Erklärung...

von Robert (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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.

von Volker S. (vloki)


Bewertung
0 lesenswert
nicht lesenswert
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.

: Bearbeitet durch User
von Thomas E. (picalic)


Bewertung
0 lesenswert
nicht lesenswert
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!

von Volker S. (vloki)


Bewertung
-1 lesenswert
nicht lesenswert
Warum wird eigentlich so ein Steinzeitmodell wie der 16F54 verwendet?

von Volker S. (vloki)


Bewertung
0 lesenswert
nicht lesenswert
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.

: Bearbeitet durch User
von Thomas E. (picalic)


Bewertung
0 lesenswert
nicht lesenswert
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.

von Robert (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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.

von Robert (Gast)


Bewertung
0 lesenswert
nicht lesenswert
bitte um Entschuldigung wenn das Gefühl hoch kommt, das ich mir hier ein 
Spaß erlaube.
habe mich sehr lange nicht mehr mit µC beschäftigt.

von Volker S. (vloki)


Bewertung
0 lesenswert
nicht lesenswert
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.

: Bearbeitet durch User
von Peter C. (peter_c49)


Bewertung
0 lesenswert
nicht lesenswert
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

von Thomas E. (picalic)


Bewertung
0 lesenswert
nicht lesenswert
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!

von Volker S. (vloki)


Bewertung
0 lesenswert
nicht lesenswert
Thomas E. schrieb:
> Wie hoch ist Deine
> Betriebsspannung überhaupt?

Robert schrieb:
> Programmer to target power is enabled - VDD = 5,000000 volts.

von Thomas E. (picalic)


Bewertung
2 lesenswert
nicht lesenswert
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...

von Karsten (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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...

von Robert (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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.

von Robert (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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?

von Volker S. (vloki)


Bewertung
0 lesenswert
nicht lesenswert
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 ;-)

: Bearbeitet durch User
von Robert (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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.

von Volker S. (vloki)


Bewertung
0 lesenswert
nicht lesenswert
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,

: Bearbeitet durch User
von Volker S. (vloki)


Bewertung
0 lesenswert
nicht lesenswert
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?

von Robert (Gast)


Bewertung
1 lesenswert
nicht lesenswert
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.

von Volker S. (vloki)


Bewertung
0 lesenswert
nicht lesenswert
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...

: Bearbeitet durch User
von Thomas E. (picalic)


Bewertung
1 lesenswert
nicht lesenswert
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.

von Toxic (Gast)


Bewertung
2 lesenswert
nicht lesenswert
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.....

von Robert (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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.jpg
https://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.

von Udo (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Meinst du nicht das der Controller ein wenig
zu wenig Speicher hat, für dein Vorhaben ?
Könnte knapp werden.

von Volker S. (vloki)


Bewertung
0 lesenswert
nicht lesenswert
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.

: Bearbeitet durch User
von Robert (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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 **********************************************************/
9
10
#include <xc.h>
11
//#include <pic16f54.h> 
12
13
// CONFIG
14
#pragma config OSC = HS         // Oscillator selection bits (HS oscillator)
15
#pragma config WDT = OFF        // Watchdog timer enable bit (WDT disabled)
16
#pragma config CP = OFF         // Code protection bit (Code protection off)
17
#define TAKT 4000000u1
18
19
20
// #pragma config statements should precede project file includes.
21
// Use project enums instead of #define for ON and OFF.
22
23
24
/** D E C L A R A T I O N S **************************************************/
25
26
void warte1ms(void){
27
    #define ZAEL (TAKT/100000u1) - 3
28
    # if ZAEL > 255
29
      #error "Wartezaehler > 255"
30
    #endif  
31
    static unsigned char i, j;
32
    for (j = 5; j != 0 ; j--){
33
        for (i = ZAEL; i != 0 ; i--){
34
        }
35
    }
36
}
37
38
39
void main(void)
40
{
41
  TRISA = 0x00;
42
43
  while(1)
44
  {
45
    RA2 = 1;
46
    warte1ms();
47
    RA2 = 0;
48
    warte1ms();
49
  }//end while
50
  return;
51
}//end main

compiler:
1
make[2]: *** [build/default/production/newmain.p1] Fehler 1
2
make -f nbproject/Makefile-default.mk SUBPROJECTS= .build-conf
3
make[1]: *** [.build-conf] Fehler 2
4
make[1]: Verzeichnis /home/rob/MPLABXProjects/versuch02.X wird betreten
5
make: *** [.build-impl] Fehler 2
6
make  -f nbproject/Makefile-default.mk dist/default/production/versuch02.X.production.hex
7
make[2]: Verzeichnis /home/rob/MPLABXProjects/versuch02.X wird betreten
8
"/opt/microchip/xc8/v1.38/bin/xc8" --pass1  --chip=16F54 -Q -G  --double=24 --float=24 --opt=default,+asm,+asmfile,-speed,+space,-debug --addrqual=ignore --mode=free -P -N255 --warn=-3 --asmlist -DXPRJ_default=default  --summary=default,-psect,-class,+mem,-hex,-file --output=default,-inhx032 --runtime=default,+clear,+init,-keep,-no_startup,-osccal,-resetbits,-download,-stackcall,+clib   --output=-mcof,+elf:multilocs --stack=compiled:auto "--errformat=%f:%l: error: (%n) %s" "--warnformat=%f:%l: warning: (%n) %s" "--msgformat=%f:%l: advisory: (%n) %s"    -obuild/default/production/newmain.p1  newmain.c 
9
ZAEL:28: error: (117) misplaced constant in #if
10
ZAEL:28: warning: (163) unexpected text in control line ignored
11
newmain.c:29: error: (103) #error: "Wartezaehler > 255"
12
(908) exit status = 1
13
nbproject/Makefile-default.mk:100: die Regel für Ziel build/default/production/newmain.p1 scheiterte
14
make[2]: Verzeichnis /home/rob/MPLABXProjects/versuch02.X wird verlassen
15
nbproject/Makefile-default.mk:84: die Regel für Ziel .build-conf scheiterte
16
make[1]: Verzeichnis /home/rob/MPLABXProjects/versuch02.X wird verlassen
17
nbproject/Makefile-impl.mk:39: die Regel für Ziel .build-impl scheiterte
18
19
BUILD FAILED (exit value 2, total time: 54ms)

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?

von Toxic (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Wenn Du eine 1ms-Warteschleife moechtest,dann lautet die mit XC8

__delay_ms(1); => das ist ist eine fertige Funktion!

Wenn Du die Led allerdings blinken sehen moechtest dann waere
__delay_ms(500); mehr angebracht(500ms)

Die Zeile #define TAKT 4000000u1 solltest Du mit
#define _XTAL_FREQ 4000000 ersetzen.

Die "void warte1ms(void)" ist ueberfluessig und auch fehlerhaft

Im uebrigen gibt es bei Reichelt einen billigen Pic mit reichlich 
Speicher und I/O-pins
http://www.reichelt.de/PIC-16F8-16LF-Controller/PIC-16F883-I-SP/3/index.html?ACTION=3&LA=446&ARTICLE=89327&GROUPID=2967&artnr=PIC+16F883-I%2FSP&SEARCH=pic16f883

von Volker S. (vloki)


Bewertung
0 lesenswert
nicht lesenswert
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?

: Bearbeitet durch User
von Volker S. (vloki)


Bewertung
0 lesenswert
nicht lesenswert
Hier mal ein kleiner Schnipsel, wie ich das oben gemeint habe:
1
 langsamerer timer zum Verändern der Helligkeit -------------------------------------------
2
    if(HDxy_an){
3
        compareHDxy = (compareHDxy << 1)+1; // 0 →1 →3 →7 →15 →31 →63 →127 →255 →255 →255....
4
     }
5
     else{
6
        compareHDxy = compareHDxy >> 1; // 255 →127 →63 →31 →15 →7 →3 →1 →0 →0 →0....
7
 }
8
9
10
Schneller timer für die PWM------------_----------
11
    if(++counter == compareHDxy)
12
        HDxy_LEDs_OFF(); 
13
    else if(counter == 0)
14
        HDxy_LEDs_ON(); // led on at counter overflow (0)
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)

: Bearbeitet durch User
von Volker S. (vloki)


Bewertung
0 lesenswert
nicht lesenswert
Sorry,  natürlich überall HDxy durch HPxy ersetzen.
x wäre dann A oder B. y 1, 2 oder 3.

von Robert (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Volker S. schrieb:
> <edit>  Wolltest du die Schalter dann jeweils mit 3 Controllern
> verbinden?

so was habe ich mir als Schalter vorgestellt:
http://images.google.de/imgres?imgurl=http%3A%2F%2Fwww.sourcingmap.de%2Fsmapimg%2Fde%2Fn%2F11a%2Feinzelzimmer-stellungen-umstellung-drehtische-nockenschalter-20a-120243n.jpg&imgrefurl=http%3A%2F%2Fwww.sourcingmap.de%2Feinzelzimmer-stellungen-umstellung-drehtische-nockenschalter-20a-p-120243.html&h=280&w=280&tbnid=97MC9alcM2tucM%3A&vet=1&docid=MEa8mH3bAP_w-M&ei=PXsxWIS7PMm0UYP0u4AC&tbm=isch&client=ubuntu&iact=rc&uact=3&dur=3551&page=0&start=0&ndsp=20&ved=0ahUKEwjEzZq2kLfQAhVJWhQKHQP6DiAQMwgiKAcwBw&bih=673&biw=1301

Ich weiß das es von Strom und Spannung vollkommen überdimensioniert ist, 
aber vom aussehen passt es einigermaßen. was schade ist, dass man den 
Schalter nicht durchdrehen kann.

entschuldigt, wenn ich Bremse oder es schnippisch rüber kommt, doch ich 
wollte wissen wo in dem letzten Code der Fehler liegt. mir liegt nicht 
viel daran eine LED in 1 ms Tackt blinken zu lassen, aber viel, Code zu 
verstehen. Trotzdem bedanke ich mich für den Hinweis, dass es auch viel 
einfacher geht.

ich habe sehr lange C für  Personal PC (Linux) geschrieben. hat das 
hier:
http://sprut.de/electronic/pic/c/pic_c/pic_c00.html
noch aktuellen Bezug zu dem wie ich die µC mit dem XC8 Compiler und ein 
aktuellen MPLAB Programmiere?

Wenn nicht, gibt es neben den schon genannten Tutorium eine weitere 
Empfehlenswerte kurze(!) Einleitung / Erläuterung in ANSI-C?

von Robert (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Volker S. schrieb:
> Sorry,  natürlich überall HDxy durch HPxy ersetzen.
> x wäre dann A oder B. y 1, 2 oder 3.

Danke, hat mich verwirrt

von Volker S. (vloki)


Bewertung
0 lesenswert
nicht lesenswert
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 
:-(

von Toxic (Gast)


Bewertung
1 lesenswert
nicht lesenswert
Wenn Du Englisch verstehst und Microchip Produkte verwendest,warum dann 
auch nicht deren "liebevoll" zubereitete Tutorials und Userguides in 
Augenschein nehmen?

"Fundamentals of the C Programming Language" unter Verwendung von xc8
http://microchip.wikidot.com/tls2101:start

========================================================
MPLAB® XC8 C Compiler User’s Guide =>

https://www.google.ie/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&cad=rja&uact=8&ved=0ahUKEwiwlbznorfQAhXDYyYKHe-JCCMQFggiMAE&url=http%3A%2F%2Fww1.microchip.com%2Fdownloads%2Fen%2FDeviceDoc%2F50002053F.pdf&usg=AFQjCNHCV3VPYeRpyCKxh7HcHz1TmfHS3g

Abweichungen von ANSI C sind im "Chapter 5. C Language Features" 
aufgefuehrt

von Volker S. (vloki)


Bewertung
0 lesenswert
nicht lesenswert
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.

von Volker S. (vloki)


Bewertung
0 lesenswert
nicht lesenswert
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))

von Thomas E. (picalic)


Bewertung
0 lesenswert
nicht lesenswert
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"...

von Volker S. (vloki)


Bewertung
0 lesenswert
nicht lesenswert
Volker S. schrieb:
> Selbst die Beschreibungen in den UserGuides der original MCHP Demo
> Boards sind oft recht schnell nicht mehr aktuell und funktionieren
> einfach nicht mehr.

Kleines Beispiel?
http://pic-projekte.de/phpBB3/viewtopic.php?p=7214#p7214

(Siehe dort auch Post #13)

: Bearbeitet durch User
von Robert (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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.jpg
https://dl.dropboxusercontent.com/u/88893402/2016-11-20%2016.25.40.jpg
https://dl.dropboxusercontent.com/u/88893402/2016-11-20%2016.25.49.jpg
https://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

von Toxic (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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.....

von Robert (Gast)


Bewertung
0 lesenswert
nicht lesenswert
danke, ich werde darauf achten.

von Volker S. (vloki)


Bewertung
0 lesenswert
nicht lesenswert
Robert schrieb:
> Warum? der Aufbau des Codes ist total aufwendig

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.


Robert schrieb:
> 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.

Ja der sieht wirklich nicht besonders vertrauenserweckend aus. Ich 
glaube aber schon, dass er was aushält. (habe selber Kinder ;-)
Gibt es aber bestimmt auch noch robuster.
Ebay-Artikel Nr. 330879641621
Das mit dem selber bauen wäre mir zu aufwendig, aber wenn du Material, 
Werkzeug und Fertigkeiten hast, dann sieht das schon anders aus.

So was wie deinen ersten Vorschlag gibt es auch noch günstiger:
https://www.amazon.de/TOOGOO-Klemmen-Positionen-Rotary-Umschalter/dp/B00TK0VMO4/ref=sr_1_1?ie=UTF8&qid=1479661341&sr=8-1&keywords=drehschalter+4+positionen

: Bearbeitet durch User
von Robert (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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.

von Robert (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Für die Suche nach alternativen Schaltern bedanke ich mich

von Volker S. (vloki)


Bewertung
0 lesenswert
nicht lesenswert
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.

: Bearbeitet durch User
von Volker S. (vloki)


Bewertung
0 lesenswert
nicht lesenswert
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!

von Thomas E. (picalic)


Bewertung
0 lesenswert
nicht lesenswert
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.

: Bearbeitet durch User
von Volker S. (vloki)


Bewertung
0 lesenswert
nicht lesenswert
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)

: Bearbeitet durch User
von Thomas E. (picalic)


Bewertung
0 lesenswert
nicht lesenswert
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.

von Robert (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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
int HP( Schalter, alter_Wert ){
2
3
   int beschläunigung = 5 // reguliert, wie schnell die Kurve ansteigt
4
   int PWM_HellAnteil = 0 // gibt an wie lange der Hellanteil anhält
5
   int Maximalwert = 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(alter wert != 0){ //der schalter ist aus, die helligkeit wird auf null reduziert
13
         alter_Wert--;
14
      }
15
   }
16
   PWM_HellAnteil = Maximalwert / (e^(1/alter_Wert * beschläunigung);
17
   //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

von Thomas E. (picalic)


Bewertung
0 lesenswert
nicht lesenswert
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.

von Thomas E. (picalic)


Bewertung
0 lesenswert
nicht lesenswert
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.

: Bearbeitet durch User
von Robert (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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.

von Thomas E. (picalic)


Bewertung
0 lesenswert
nicht lesenswert
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!

von Toxic (Gast)


Angehängte Dateien:
  • preview image for 1.jpg
    1.jpg
    241 KB, 323 Downloads
  • preview image for 2.jpg
    2.jpg
    243 KB, 298 Downloads

Bewertung
0 lesenswert
nicht lesenswert
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

von Thomas E. (picalic)


Bewertung
0 lesenswert
nicht lesenswert
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...
1
#include <xc.h>
2
#include <math.h>
3
#include <stdint.h>
4
5
void main(void) {
6
7
    int16_t x=5, y=10;
8
    float result;
9
    result = exp(x*y);
10
}

von robert (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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.

von Thomas E. (picalic)


Bewertung
0 lesenswert
nicht lesenswert
Toxic schrieb:
> Da MPLABX bei mir gerade laeuft,habe ich spasseshalber mal eine
> Exponentialfunktion eingebunden.

Hihi - zwei doofe, ein Gedanke... ;)

von Toxic (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Thomas E. schrieb:
> Hihi - zwei doofe, ein Gedanke... ;)

....aber ich hab hab gewonnen - speed-wise :-)

von Thomas E. (picalic)


Bewertung
0 lesenswert
nicht lesenswert
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
void main(void) {
5
6
    uint16_t wert = 0, zielwert = 0xFFFF;
7
 
8
    while(wert != zielwert)
9
    {
10
        int16_t diff = ((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.

von Volker S. (vloki)


Bewertung
0 lesenswert
nicht lesenswert
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

von Volker S. (vloki)


Bewertung
0 lesenswert
nicht lesenswert
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...

von Robert (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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.

von Volker S. (vloki)


Bewertung
0 lesenswert
nicht lesenswert
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.

: Bearbeitet durch User
von Robert (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Volker S. schrieb:
> 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

ist das wirklich der richtige link?

von Volker S. (vloki)


Bewertung
0 lesenswert
nicht lesenswert

von Robert (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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.
1
/*
2
 * File:   RonjasKuecheMain.c
3
 * Author: rob
4
 *
5
 * Created on 21. November 2016, 20:56
6
 */
7
8
#include <xc.h>
9
10
// CONFIG
11
#pragma config OSC = HS         // Oscillator selection bits (HS oscillator)
12
#pragma config WDT = OFF        // Watchdog timer enable bit (WDT disabled)
13
#pragma config CP = OFF         // Code protection bit (Code protection off)
14
#define _XTAL_FREQ 4000000
15
#define PB PORTBbits.RB3
16
17
18
// #pragma config statements should precede project file includes.
19
// Use project enums instead of #define for ON and OFF.
20
21
22
/** D E C L A R A T I O N S **************************************************/
23
24
unsigned char HP(char eingang, char ausgang, unsigned char alter_Wert){
25
    unsigned char j = 0;
26
    
27
    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
    return alter_Wert;
50
}
51
52
53
void main(void)
54
{
55
  TRISA = 0x00; //Ausgang
56
  TRISB = 0XFF; //Eingang
57
  
58
  unsigned char alter_WertHPA1 = 0;
59
  unsigned char alter_WertHPA2 = 0;
60
  unsigned char alter_WertHPA3 = 0;
61
  unsigned char alter_WertHPB1 = 0;
62
  unsigned char alter_WertHPB2 = 0;
63
  unsigned char alter_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"

von Robert (Gast)


Bewertung
0 lesenswert
nicht lesenswert
hier das Video einer langsam an und ausgehenden LED...

https://dl.dropboxusercontent.com/u/88893402/VID_20161123_141428.3gp

von Volker S. (vloki)


Bewertung
0 lesenswert
nicht lesenswert
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.

von Thomas E. (picalic)


Bewertung
0 lesenswert
nicht lesenswert
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_t LEDwert[6];  // Helligkeit für 6 Kanäle, Wert in den oberen Bits!
2
3
4
void WertAnpassung(uint8_t Kanal, uint8_t Ziel)
5
{
6
    uint16_t ziel16 = Ziel << 8;
7
    int16_t diff = ((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
12
            diff = 1;
13
        LEDwert[Kanal] -= diff;
14
    }
15
}

: Bearbeitet durch User
von Rob W. (rob_w408)


Bewertung
0 lesenswert
nicht lesenswert
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:
1
/*
2
 * File:   RonjasKuecheV02Main.c
3
 * Author: rob
4
 *
5
 * Created on 21. November 2016, 20:56
6
 */
7
8
#include <xc.h>
9
// CONFIG
10
#pragma config OSC = HS         // Oscillator selection bits (HS oscillator)
11
#pragma config WDT = OFF        // Watchdog timer enable bit (WDT disabled)
12
#pragma config CP = OFF         // Code protection bit (Code protection off)
13
#define _XTAL_FREQ 4000000
14
#define Zyklen 250
15
16
17
// #pragma config statements should precede project file includes.
18
// Use project enums instead of #define for ON and OFF.
19
20
21
/** D E C L A R A T I O N S **************************************************/
22
23
unsigned char HP(char eingang, unsigned char alter_Wert){
24
    
25
    if(eingang){ // Wenn Schalter 1 dann wert erhohen, wenn schalter 0 dann verringern
26
        if(alter_Wert < Zyklen){
27
            alter_Wert++;
28
        }      
29
    }else{
30
        if(alter_Wert > 0){
31
            alter_Wert--;
32
        }  
33
    }
34
    
35
    return alter_Wert;
36
}
37
38
39
void main(void)
40
{
41
  TRISA = 0X00; //Ausgang    
42
  TRISB = 0xFF; //Eingang
43
  
44
  unsigned char alter_WertHPA1 = 0;
45
  unsigned char alter_WertHPA2 = 0;
46
  unsigned char alter_WertHPA3 = 0;
47
48
  unsigned char j = 0;
49
50
  while(1)
51
  {
52
     alter_WertHPA1 = HP (RB1, alter_WertHPA1); 
53
     for ( j = 0; j < alter_WertHPA1; j++){
54
        RA1 = 1;  
55
     }
56
     RA1 = 0;
57
     for ( j = 0; j < (Zyklen - alter_WertHPA1); j++){}
58
     if(!(Zyklen - alter_WertHPA1)){ //um die volle leuchtkraft der LED's gegen ende der Ladekurve zu nutzen
59
         RA1 = 1;
60
     }
61
62
    
63
     //*************************************************************************
64
     alter_WertHPA2 = HP (RB2, alter_WertHPA2);
65
           for ( j = 0; j < alter_WertHPA2; j++){
66
        RA2 = 1;  
67
     }
68
     RA2 = 0;
69
     for ( j = 0; j < (Zyklen - alter_WertHPA2); j++){}  
70
     if(!(Zyklen - alter_WertHPA2)){ //um die volle leuchtkraft der LED's gegen ende der Ladekurve zu nutzen
71
         RA2 = 1;
72
     }
73
         
74
    //************************************************************************* 
75
     alter_WertHPA3 = HP (RB3,alter_WertHPA3);
76
     for ( j = 0; j < alter_WertHPA3; j++){
77
        RA3 = 1;  
78
     }
79
     RA3 = 0;
80
     for ( j = 0; j < (Zyklen - alter_WertHPA3); j++){}    
81
     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.

: Bearbeitet durch User
von Rob W. (rob_w408)


Bewertung
0 lesenswert
nicht lesenswert
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.

von Thomas E. (picalic)


Bewertung
0 lesenswert
nicht lesenswert
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.

von Rob W. (rob_w408)


Bewertung
0 lesenswert
nicht lesenswert
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.

: Bearbeitet durch User
von Toxic (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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.

von Thomas E. (picalic)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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...

: Bearbeitet durch User
von Rob W. (rob_w408)


Bewertung
0 lesenswert
nicht lesenswert
Toxic schrieb:
> wie man generell PWM per Software einfach
> realisieren kann

habe ich bei der PWM ein Fehler gemacht?

Thomas E. schrieb:
> Hab eben mal ein wenig getüftelt

und ich habe ein wenig gefilmt:

https://dl.dropboxusercontent.com/u/88893402/2016-11-27%2012.09.22.3gp

ich möchte damit nur zweigen wie sich das Programm auf ein µC verhält.

von Rob W. (rob_w408)


Bewertung
0 lesenswert
nicht lesenswert
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.

von Toxic (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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.

von Thomas E. (picalic)


Bewertung
0 lesenswert
nicht lesenswert
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.

: Bearbeitet durch User
von Rob W. (rob_w408)


Bewertung
0 lesenswert
nicht lesenswert
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

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Bewertung
0 lesenswert
nicht lesenswert
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.

von Rob W. (rob_w408)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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)
18
#pragma config FCMEN = OFF      // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor disabled)
19
#pragma config IESO = OFF       // Internal/External Oscillator Switchover bit (Oscillator Switchover mode disabled)
20
21
// CONFIG2L
22
#pragma config PWRTEN = OFF     // Power-up Timer Enable bit (PWRT disabled)
23
#pragma config BOREN = SBORDIS  // Brown-out Reset Enable bits (Brown-out Reset enabled in hardware only (SBOREN is disabled))
24
#pragma config BORV = 19        // Brown Out Reset Voltage bits (VBOR set to 1.9 V nominal)
25
26
// CONFIG2H
27
#pragma config WDTEN = ON       // Watchdog Timer Enable bit (WDT is always enabled. SWDTEN bit has no effect.)
28
#pragma config WDTPS = 32768    // Watchdog Timer Postscale Select bits (1:32768)
29
30
// CONFIG3H
31
#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
void main(){
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?

von Toxic (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Rob W. schrieb:
Ich wuerde zuerst mal den Watchdog timer deaktiveren

> #pragma config WDTEN = ON => #pragma config WDTEN = OFF

Nur zur Info:
http://microchipdeveloper.com/8bit:wdt

von Volker S. (vloki)


Bewertung
0 lesenswert
nicht lesenswert
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;

von rob wod (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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)
19
#pragma config FCMEN = OFF      // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor disabled)
20
#pragma config IESO = OFF       // Internal/External Oscillator Switchover bit (Oscillator Switchover mode disabled)
21
22
// CONFIG2L
23
#pragma config PWRTEN = OFF     // Power-up Timer Enable bit (PWRT disabled)
24
#pragma config BOREN = SBORDIS  // Brown-out Reset Enable bits (Brown-out Reset enabled in hardware only (SBOREN is disabled))
25
#pragma config BORV = 19        // Brown Out Reset Voltage bits (VBOR set to 1.9 V nominal)
26
27
// CONFIG2H
28
#pragma config WDTEN = OFF      // Watchdog Timer Enable bit (WDT is controlled by SWDTEN bit of the WDTCON register)
29
#pragma config WDTPS = 32768    // Watchdog Timer Postscale Select bits (1:32768)
30
31
// CONFIG3H
32
#pragma config HFOFST = ON      // HFINTOSC Fast Start-up bit (HFINTOSC starts clocking the CPU without waiting for the oscillator to stablize.)
33
#pragma config MCLRE = ON       // MCLR Pin Enable bit (MCLR pin enabled, RA3 input pin disabled)
34
35
// CONFIG4L
36
#pragma config STVREN = ON      // Stack Full/Underflow Reset Enable bit (Stack full/underflow will cause Reset)
37
#pragma config LVP = ON         // Single-Supply ICSP Enable bit (Single-Supply ICSP enabled)
38
#pragma config BBSIZ = OFF      // Boot Block Size Select bit (1kW boot block size)
39
#pragma config XINST = OFF      // Extended Instruction Set Enable bit (Instruction set extension and Indexed Addressing mode disabled (Legacy mode))
40
41
// CONFIG5L
42
#pragma config CP0 = OFF        // Code Protection bit (Block 0 not code-protected)
43
#pragma config CP1 = OFF        // Code Protection bit (Block 1 not code-protected)
44
45
// CONFIG5H
46
#pragma config CPB = OFF        // Boot Block Code Protection bit (Boot block not code-protected)
47
#pragma config CPD = OFF        // Data EEPROM Code Protection bit (Data EEPROM not code-protected)
48
49
// CONFIG6L
50
#pragma config WRT0 = OFF       // Write Protection bit (Block 0 not write-protected)
51
#pragma config WRT1 = OFF       // Write Protection bit (Block 1 not write-protected)
52
53
// CONFIG6H
54
#pragma config WRTC = OFF       // Configuration Register Write Protection bit (Configuration registers not write-protected)
55
#pragma config WRTB = OFF       // Boot Block Write Protection bit (Boot block not write-protected)
56
#pragma config WRTD = OFF       // Data EEPROM Write Protection bit (Data EEPROM not write-protected)
57
58
// CONFIG7L
59
#pragma config EBTR0 = OFF      // Table Read Protection bit (Block 0 not protected from table reads executed in other blocks)
60
#pragma config EBTR1 = OFF      // Table Read Protection bit (Block 1 not protected from table reads executed in other blocks)
61
62
// CONFIG7H
63
#pragma config EBTRB = OFF      // Boot Block Table Read Protection bit (Boot block not protected from table reads executed in other blocks)
64
65
// #pragma config statements should precede project file includes.
66
// Use project enums instead of #define for ON and OFF.
67
68
#include <xc.h>
69
70
//#define _XTAL_FREQ 2000000
71
72
void main(){
73
    
74
    TRISA = 0xFF; //Eingang
75
    TRISB = 0X00; //Ausgang    
76
    while(1){
77
        RB7 = 1;
78
        LATBbits.LATB7 = 1;
79
    }
80
81
}

von Volker S. (vloki)


Bewertung
0 lesenswert
nicht lesenswert
Versuch doch mal die LED zu toggeln.
Mit dem Debugger im Einzelschrittmodus kannst du sehen ob es 
funktioniert und auch die Register überprüfen...

von Rob W. (rob_w408)


Bewertung
0 lesenswert
nicht lesenswert
im debug modus leuchtet mir die LED.
warum nicht im laufendem Program?

von Volker S. (vloki)


Bewertung
0 lesenswert
nicht lesenswert
Ist MCLR beschaltet, oder hängt der in der Luft?

von rob wod (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Danke
ich habe das wieder verwechselt.

und warum geht das wieder nicht:
1
void unterprogram(){
2
    RB7 = !RB7;
3
}
4
5
void main(){
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.

von Volker S. (vloki)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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 ;-)

: Bearbeitet durch User
von Toxic (Gast)


Bewertung
0 lesenswert
nicht lesenswert
rob wod schrieb:
> ich brauch halt wieder ein paar hilfen um wieder in das Thema rein zu
> kommen. November ist ja auch schon etwas her.

Na dann fuer den Newbie.....
https://www.youtube.com/watch?v=eoh6fL61dDg

http://microchipdeveloper.com/tls2101:start

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.