Autor |
1-Wire Projekt, Code Hilfe C |
|
|
|
|
BID = 936335
trafostation Schriftsteller
Beiträge: 595
|
|
Build succesfull !, aber leider funktioniert die Sache noch nicht.
Es geht leider nur Button1, und meine Test LED leuchtet jetzt plötzlich nur noch ganz schwach ! (nein ist nicht kaputt) sehr seltsam warum denn das ?
Auf Button2 tut sich gar nichts.
Zeile 85: else if, stimmt das ?
[ Diese Nachricht wurde geändert von: trafostation am 31 Aug 2014 20:30 ] |
|
BID = 936339
Maik87 Schriftsteller
Beiträge: 856 Wohnort: Wesel / Niederrhein
|
|
Zitat :
trafostation hat am 31 Aug 2014 20:27 geschrieben :
|
Build succesfull !
|
Guter Anfang!
Zitat :
|
aber leider funktioniert die Sache noch nicht.
|
Schade!
Zitat :
|
Es geht leider nur Button1, und meine Test LED leuchtet jetzt plötzlich nur noch ganz schwach ! (nein ist nicht kaputt) sehr seltsam warum denn das ?
|
Ich habe ein ganz bischen den Code schneller gemacht. dazu habe ich in Zeile 95 und 113 den delay nur laufen lassen, wenn die Taste zuvor gedrückt war. Scheinbar ist nun die PWM für die LED zu schnell.
Füge mal unter "//ENDE: neue iButton anlernen" in Zeile 127:
Code : |
//Code bremsen, damit die LED länger/heller leuchtet
__delay_ms(500);
|
|
Mit dem Wert kannst du variieren. Höhere Zahl = LED leuchtet stabiler, dafür wird das Programm wieder träger. Schraubst du die ms runter, könnte die LED wieder schwächer werden, dafür ist das Programm schneller. Einfach mal testen.
Zitat :
|
Auf Button2 tut sich gar nichts.
|
Mach mal in Zeile 114 aus BUTTON_INPUT ein BUTTON_INPUT2
Zitat :
|
Zeile 85: else if, stimmt das ?
|
iskeyonlist kann nur 1 ODER 2 sein. Das else if bedeutet, dass auf iskeyonlist == 2 nur geprüft wird, wenn iskeyonlist == 1 NICHT zutrifft. Bringt minimale Performancesteigerung.
[ Diese Nachricht wurde geändert von: Maik87 am 31 Aug 2014 20:44 ] |
|
BID = 936344
trafostation Schriftsteller
Beiträge: 595
|
Delay will er nicht !
"128.1 function declared inplicit int"
Zeile 114 BUTTON_INPUT2 ist ausgebessert, der funktioniert aber immer noch nicht richtig, nur wenn man auf dem Button draufbleibt leuchtet der 2. Ausgang, aber der Schlüssel wird nicht gespeichert.
Was vielleicht noch von Interesse ist, in meiner ursprünglichen Anpassung hat der 2. Button auch nur funktioniert wenn ich bei
if (BUTTON_INPUT ==0)
{
_delay_MS(1000);
} DIESE Klammer eingefügt habe, warum auch immer.
|
BID = 936347
Maik87 Schriftsteller
Beiträge: 856 Wohnort: Wesel / Niederrhein
|
Zitat :
trafostation hat am 31 Aug 2014 21:06 geschrieben :
|
Delay will er nicht !
"128.1 function declared inplicit int"
|
Vertippt oder so? In Zeile 123 funktioniert es ja auch. Copy,Paste&try again.
Zitat :
|
Zeile 114 BUTTON_INPUT2 ist ausgebessert, der funktioniert aber immer noch nicht richtig, nur wenn man auf dem Button draufbleibt leuchtet der 2. Ausgang,
|
In Zeile 111 wird geprüft, ob der Button2 gedrückt ist. Falls ja, wird eine Sekunde gewartet und dann nochmals geprüft, ob der Button2 gedrückt ist. Ist dies der Fall, DANN wird erst gespeichert bzw. geblinkt.
Zitat :
|
aber der Schlüssel wird nicht gespeichert.
|
Wird denn der erste (noch) gespeichert?
Was vielleicht noch von Interesse ist, in meiner ursprünglichen Anpassung hat der 2. Button auch nur funktioniert wenn ich bei
if (BUTTON_INPUT ==0)
{
_delay_MS(1000);
} DIESE Klammer eingefügt habe, warum auch immer.
[/quote]
Diese Klammer ist bei mir in Zeile 108 gewandert. Vorher wurde geprüft, ob die Taste gedrückt ist. Falls ja, wurde eine Sekunde das Programm angehalten. Dann wurde erneut geprüft, ob die Taste gedrückt ist und ggf. Speichern/Blinken ausgelöst. Machte in meinen Augen keinen Sinn, daher habe ich das zweite If ins erste verschachtelt, so dass diese beiden im Abstand von 1 Sekunde hintereinhander geprüft werden und Speichern/Blinken nur stattfindet, wenn beide If's OK sind, sprich die Taste länger als 1 Sekunde gedrückt wurde.
|
BID = 936360
trafostation Schriftsteller
Beiträge: 595
|
Gut möglich das ich da einen Fehler gemacht habe, ich probiere das mit den Delay dann nochmal.
Äh, warum eigentlich eine PWM ?, momentan hab ich am Ausgang nur eine LED noch keinen Transistor, ob der dann damit zurechtkommt.
Button 1 bleibt gespeichert, aber Button 2 auch nicht wenn man länger drauf bleibt. Übrigens leuchtet die 2. LED ganz normal hell.
Trotzdem danke ich Dir schonmal ganz herzlich für deine Hilfe
|
BID = 936368
trafostation Schriftsteller
Beiträge: 595
|
Ah, Moment es geht scheinbar doch !, nur die 2. LED ist so schwach das ich sie nicht gesehen habe ! (wegen der Arbeitsbeleuchtung)
Beim Drücken leuchtet die LED normal, dann funzelt es nur noch, vielleicht kann man da nochwas machen.
|
BID = 936369
Maik87 Schriftsteller
Beiträge: 856 Wohnort: Wesel / Niederrhein
|
Zitat :
trafostation hat am 31 Aug 2014 21:48 geschrieben :
|
Äh, warum eigentlich eine PWM ?
|
PMW daher, weil ja das Programm innerhalb der Schleifer (while(1)) im Kreis rennt und die LED ganz schnell hintereinander erst aus und bei korrekt gelesenem Schlüssel wieder einschaltet.
Zitat :
|
Button 1 bleibt gespeichert, aber Button 2 auch nicht wenn man länger drauf bleibt.
|
Guter Ansatz - check ich nochmal.
Zitat :
|
Übrigens leuchtet die 2. LED ganz normal hell.
|
Die 2. LED ersetzt derzeit den Transistor oder ist die eigentliche LED?
PS: Teste mal folgendes:
Zeile 59 - 61 auskommentieren ( // vorstellen).
Unter Zeile 68 "TRANSISTOR2 = OFF;" einfügen.
Überschreibst du beim Programmieren auch den EEPROM des PIC? Dieser ist ja nicht flüchtig und das Programm hängt die Seriennummer immer an eine freie Stelle in den Speicher. Altdaten werden nicht überschrieben! Nicht, dass wir hier rumsuchen, weil noch alte Einträge drin sind.
Dann kannst du die beiden Zeilen mit dem neuen Delay auch weglassen!
[ Diese Nachricht wurde geändert von: Maik87 am 31 Aug 2014 22:19 ]
|
BID = 936370
Maik87 Schriftsteller
Beiträge: 856 Wohnort: Wesel / Niederrhein
|
Zitat :
trafostation hat am 31 Aug 2014 22:06 geschrieben :
|
Ah, Moment es geht scheinbar doch !, nur die 2. LED ist so schwach das ich sie nicht gesehen habe ! (wegen der Arbeitsbeleuchtung)
Beim Drücken leuchtet die LED normal, dann funzelt es nur noch, vielleicht kann man da nochwas machen.
|
Ah - wie jetzt?
Klär mich mal auf, welche LED wann wie funzelt
Gleiche LED mit gleichen Vorwiderständen verbaut?
Versuch mal das unter PS des letztens Posts. Scheinbar hatte ich einen Denkfehler und man sollte die LED nicht bei jedem Schleifendurchgang neu setzen sodern nur löschen lassen, wenn OWReset sich meldet. Das ist dann wohl der Fall, wenn der iButton wieder entfernt wird!?
|
BID = 936379
trafostation Schriftsteller
Beiträge: 595
|
Der PIC wird komplett gelöscht, auch der EEPROM, das ist schon ok.
Beide LED an den Transistor 1 und 2 Ausgängen funzeln, auch mit den beiden BC548 (mit 2k2 an der Base), das ändert nichts.
Das ist aber wichtig das die voll durchschalten, wenn dann noch eine Last dranhängen sollte.
Ja, wenn der iButton entfernt wird sollen alle LED wieder ausgehen, das tut es zwar jetzt auch.
Bei der Ursprünglichen Schaltung hat das auch so funktioniert, ohne PWM, da gab es keine Probleme mit der Performance.
Somit ist es nicht notwendig die LED jedesmal neu zu setzen denke ich.
Eine Idee hätte ich noch, es wäre super wenn man noch eine EEPROM Löschfunktion einbauen könnte, wenn man die Buttons gedrückt hält, und danach die Spannungsversorgungs anschließt, sollten alle gespeicherten iButtons gelöscht werden.
Vielleicht fällt dir dazu etwas ein, eventuell mit einer while Schleife am Beginn oder so.
|
BID = 936381
Maik87 Schriftsteller
Beiträge: 856 Wohnort: Wesel / Niederrhein
|
Versuch es mal hiermit.
Wenn die LED noch immer funzeln sollte, dann versteh ich es nicht mehr.
Versuch auch mal bitte das Löschen des EEPROMS. Dazu beide Tasten gedrückt halten und dann Strom auf den PIC geben.
|
BID = 936423
trafostation Schriftsteller
Beiträge: 595
|
Fast perfekt !
Die LED funktionieren jetzt einwandfrei, auch die Buttons, und Speicherfunktion, genauso wie gedacht, super !
Nur die EEPROM Löschfunktion will MPLAB so nicht akzeptieren.
Zitat :
| MPLAB\main.c; 59.19 inconsistent type
MPLAB\main.c; 59.23 no identifier in declaration |
Bin nicht draufgekommen was da nicht passt, der Code sieht eigentlich gut aus.
Code : |
//EEPROM löschen
if(BUTTON_INPUT == 0 && BUTTON_INPUT2 == 0)
{
for(unsigned char bit = 0; bit < 256; bit++)
{
eeprom_write(bit, 0xFF);
}
} |
|
|
BID = 936424
Maik87 Schriftsteller
Beiträge: 856 Wohnort: Wesel / Niederrhein
|
Nenne "bit" mal in "byte" um. Sowohl im Schleifenkopf als auch in der Funktion. Wird wohl ein geschützter Begriff sein, den man nicht als Variablenname nutzen darf.
Ich sollte wirklich mal wieder nen Compiler installieren, in PSpad bemerkt man solche Fehler nicht :-/
|
BID = 936427
trafostation Schriftsteller
Beiträge: 595
|
Ja, das wars !, bit ist geschützt.
Löschen funktioniert jetzt auch einwandfrei.
Allerdings muss nach dem Löschen die Stromversorgung wieder getrennt werden damit das Device wieder funktioniert.
Prinzipiell ist das egal, vielleicht könnte man aber auch eine Abfrage einbauen das er die Schleife wieder verläßt wenn die Buttons losgelassen und wieder auf 1 sind ?
|
BID = 936428
Maik87 Schriftsteller
Beiträge: 856 Wohnort: Wesel / Niederrhein
|
Das If ist nur eine einmalige Entscheidung, ob in die Schleife reingegangen wird oder nicht. Also nur "löschen" oder "nicht löschen". Also kann es an den Button nicht liegen. Die Schleife durchläuft alle 256 EEPROM-Adressen und beendet sich und das If von allein. Danach startet erst die Endlosschleife.
Hast du den Schleifenkopf - vorallem das "byte < 256" richtig geschrieben?
Es gibt nur zwei Möglichkeiten:
1. diese Schleife ist durch einen Fehler eine Endlosschleife (kann man rausfinden, in dem man in der Schleide die LED blinken lässt)
2. das IC stürzt in der Schleife ab. Aber wieso? Kann nur sein, weil eine falsche EEPROM-Adresse angesprochen wird. Schau mal ins Datenblatt - der IC hat einen 256b grossen EEPROM, richtig?
|
BID = 936457
trafostation Schriftsteller
Beiträge: 595
|
EEPROM hat 256b, stimmt.
MPLAB hat noch was zu bemängeln, trotz erfolgreicher Compilierung.
Zitat :
| MPLAB\main.c; 61. degenerate signed comparison
MPLAB\main.c; 61. mismatched comparison
MPLAB\main.c; 61. constant conditional branch |
So sieht das jetzt aus:
Code : |
//EEPROM löschen
if(BUTTON_INPUT == 0 && BUTTON_INPUT2 == 0)
for(unsigned char byte = 0; byte < 256; byte++)
{
eeprom_write(byte, 0xFF);
}
} |
|
|