Autor |
1-Wire Projekt, Code Hilfe C |
|
|
|
|
BID = 936459
Maik87 Schriftsteller
Beiträge: 856 Wohnort: Wesel / Niederrhein
|
|
Bingo!
Daher stürzt das IC an der Stelle ab!
unsigned char speichert nur Werte von 0 bis 255. Mehr brauchen wir eigentlich auch nicht... EIGENTLICH. Die Schleife läuft so lange, wie der Wert kleiner 256 ist. Sie steigt aus, WENN der Wert 256 ist. Das passt aber nicht in die Variable. Also wird das EEPROM bis zur letzten Stelle überschrieben, die Variable auf 256 erhöht und schon stürtzt das Teil im richtigen Moment ab
Opfern wir noch ein byte:
Änder "unsigned char" in "unsigned short" und das Problem ist erledigt
PS: Zwischen ) und for fehlt die { |
|
BID = 936461
trafostation Schriftsteller
Beiträge: 595
|
|
Hab jetzt die grüne LED eingefügt, und die blinkt auch nach dem loslassen der Buttons munter weiter !
nach der Zeile:
eeprom_write(byte, 0xFF)
_delay_ms(50);
GREEN_LED = ON;
delay_ms(50);
GREEN_LED = OFF;
}
]
edit: unsigned short hat nicht geholfen,(LED blinkt weiter) Fehlermeldung kommt aber keine mehr.
{ ist auch drinnen.
[ Diese Nachricht wurde geändert von: trafostation am 1 Sep 2014 15:55 ]
[ Diese Nachricht wurde geändert von: trafostation am 1 Sep 2014 15:59 ] |
|
BID = 936463
Maik87 Schriftsteller
Beiträge: 856 Wohnort: Wesel / Niederrhein
|
Zitat :
trafostation hat am 1 Sep 2014 15:51 geschrieben :
|
edit: unsigned short hat nicht geholfen,(LED blinkt weiter) Fehlermeldung kommt aber keine mehr.
|
Dann nehm die Variablendeklaration mal aus der Schleife raus. Eventuell mag das der Compiler nicht:
Code : |
//EEPROM löschen
if(BUTTON_INPUT == 0 && BUTTON_INPUT2 == 0){
unsigned short byte = 0;
for(byte = 0; byte < 256; byte++)
{
eeprom_write(byte, 0xFF);
_delay_ms(50);
GREEN_LED = ON;
delay_ms(50);
GREEN_LED = OFF;
}
}
|
|
|
BID = 936464
trafostation Schriftsteller
Beiträge: 595
|
Die Deklaration stört ihn nicht, LED blinkt immer noch.
Wird wohl irgenteine Klammer oder Semikolon sein.
Nein, HALT, STOPP, da hab ich wohl mit dem LED Code Mist gebaut !
Es klappt jetzt wunderbar ! ! !
[ Diese Nachricht wurde geändert von: trafostation am 1 Sep 2014 16:08 ]
|
BID = 936465
Maik87 Schriftsteller
Beiträge: 856 Wohnort: Wesel / Niederrhein
|
Zitat :
trafostation hat am 1 Sep 2014 16:03 geschrieben :
|
Die Deklaration stört ihn nicht, LED blinkt immer noch.
Wird wohl irgenteine Klammer oder Semikolon sein.
|
Ganz sicher, dass du den Code 1:1 fehlerfrei übertragen hast?
<= 255 anstatt < 256 wird wohl auch nichts bringen.
|
BID = 936467
Maik87 Schriftsteller
Beiträge: 856 Wohnort: Wesel / Niederrhein
|
Zitat :
trafostation hat am 1 Sep 2014 16:03 geschrieben :
|
Nein, HALT, STOPP, da hab ich wohl mit dem LED Code Mist gebaut !
Es klappt jetzt wunderbar ! ! !
|
Ich geb' zwar zu, ziemlich aus C raus zu sein, aber dass ich selbst da schon scheitern sollte, gab mir echt zu denken
Schwere Geburt!! Hoffen wir nur, dass du lang Freude dran hast!
Ich warte schon auf:
- Ich möchte die iButton für 1 und 2 getrennt löschen können.
- Ich möchte einen einzelnen iButton löschen können.
- Die Aufteilung zw. 1 und 2 soll nicht strikt 16:16 sein sondern fließend.
|
BID = 936470
trafostation Schriftsteller
Beiträge: 595
|
So, an dieser Stelle möchte ich Dir ein riesen DANKESCHÖN aussprechen für die großartige Unterstützung und das du dir soviel Zeit für mich genommen hast
Du hast ausgezeichnete Arbeit geleistet
Und ich habe dabei einiges gelernt.
Die Schaltung funktioniert jetzt exakt so wie sie soll.
Oh Mann, du hast mich durchschaut (ja, getrennt löschen, sehr fein !)
Also ich möchte den gesamten Code auf einen PIC16F628A übertragen(davon habe ich noch viele herumliegen, he, he ), da wäre es natürlich klasse wenn ich da noch 1-2 Ausgänge dazubasteln könnte.
Könntest du mir den Code erklären ab etwa Zeile 156 WriteEEPROM wo das in den Speicher geschrieben wird, das mit den keys 16 /32, was passiert da genau, und wie müsste es dann aussehen wenn man da noch ein 3. Button/Transistor hinzukäme ?
|
BID = 936475
Maik87 Schriftsteller
Beiträge: 856 Wohnort: Wesel / Niederrhein
|
Zitat :
trafostation hat am 1 Sep 2014 16:28 geschrieben :
|
DANKESCHÖN
|
Gern geschehen! Hat Spaß gemacht und gelernt hab ich auch was.
Zitat :
|
Du hast ausgezeichnete Arbeit geleistet
|
Naja... Viel in die Butze gegangen - sehr viel!!
Code : |
Und ich habe dabei einiges gelernt.
|
|
Nicht nur du!
Code : |
Die Schaltung funktioniert jetzt exakt so wie sie soll.
|
|
Code : |
Oh Mann, du hast mich durchschaut (ja, getrennt löschen, sehr fein !)
|
|
Ohje... Die Tage mal
Zitat :
|
Könntest du mir den Code erklären ab etwa Zeile 156 WriteEEPROM wo das in den Speicher geschrieben wird, das mit den keys 16 /32, was passiert da genau, und wie müsste es dann aussehen wenn man da noch ein 3. Button/Transistor hinzukäme ?
|
Klaro!
Ganz einfach:
Ausgangssituation war, dass man 32 "verschiedene" ("" daher, weil das Programm nicht merkt, wenn ein Schlüssel mehrfach angelernt wird) Schlüssel speichern kann. Alle im Index von 0 bis 31.
Das ursprüngliche Problem war, dass nur der große Haufen durchgeguckt wurde um feststellen, OB der Schlüssel bekannt ist oder nicht. Da du aber eine Unterscheidung zw. Button1 und Button2 haben wolltest, habe ich die 32 Speicherplätze in 1-16 (Index 0-15) und 17-32 (Index 16-31) aufgeteilt. Je nach dem, wo der Schlüssel gespeichert ist, wird entweder Transistor1 ODER Transistor2 geschaltet.
Zunächst habe ich die Funktion WriteEEPROM um den Parameter keyno (Schlüsselnummer) erweitert. Dieser bestimmt, an welcher Stelle im EEPROM gespeichert wird. Wird benötigt, um später festzustellen, welcher Transistor gemeint ist.
In der Schleife "for(keys; keys < keysl; keys++)" wird die erste freie Speicherstelle im EEPROM gesucht. Hier wird später der Schlüssel hingeschrieben. Eine For-Schleife ist aufgebaut nach (Startwert; Bedingung; Wertänderung). Das If darüber entscheidet, ob wir die Schleife von 0 bis kleiner 16 oder von 16 bis kleiner 32 laufen lassen. 1. Hälfte oder 2. Hälfte EEPROM -> Transistor1 oder Transistor2.
CheckEEPROM ist wie folgt verändert:
Er durchsucht nicht mehr alle 32 Speicherplätze (dann wüssten wir nämlich nicht, zu welchem Transistor der iButton gehört) sondern im ersten Schritt nur die ersten 16 Plätze. Schlüssel gefunden -> gibt er 1 zurück. Wenn der Schlüssel nicht gefunden wurde, wird in der oberen Hälfte des EEPROMs gesucht. Schlüssel gefunden -> return 2 für den zweiten Transistor. Schlüssel wieder nicht gefunden -> return 0 -> Schlüssel unbekannt.
Nun nur noch die main-loop um eine zweite Anlerntaste und eine zweite Schlüsselauswertung ergänzt und fertig ist die Kiste.
Für weitere Schlüssel musst du nur die Bereiche 1-16 und 17-32 weiter aufbrechen. Dynamische Anzahl Speicherplätze für die Schlüssel währe eine große Änderung.
Dagegen sind eine 3. Taste, einzeln löschen etc ein Kinderspiel
|
BID = 936477
trafostation Schriftsteller
Beiträge: 595
|
Aha, da heißt praktisch für 4 Ausgänge dann 1-8, 9-16, 17-24, 25-32.
Das werd ich mir ansschauen, zuerst aber muss ich herausfinden wie ich den PIC16F628 entsprechend konfiguriere, Register, Timer usw. da sind garantiert wieder fiese Stolperfallen drin...
|
BID = 936478
Maik87 Schriftsteller
Beiträge: 856 Wohnort: Wesel / Niederrhein
|
Zitat :
trafostation hat am 1 Sep 2014 17:05 geschrieben :
|
Aha, da heißt praktisch für 4 Ausgänge dann 1-8, 9-16, 17-24, 25-32.
|
Korrekt!!
Natürlich kann man bei mehreren Ausgängen auch statt
Code : |
if(keyno == 1){
keys = 0;
keysl = 16;
}else{
keys = 16;
keysl = 32;
} |
|
dynamisch arbeiten:
Code : |
#define ANZ_SP 16 //Speicherplätze je Transistor (16 für 2T, 8 für 4T ...)
keys = ANZ_SP * keyno - ANZ_SP;
keysl = ANZ_SP * keyno;
|
|
CheckEEPROM kannste dann auch vereinfachen.
Versuch es mal!
Wenn du nicht unbedingt Wert darauf legst, dass jeder Transistor einen eigenen Programmierbutton hat, kannst du auch hier ansetzen und noch per IO-Pins für mehr Transistoren übrig machen.
|
BID = 936480
trafostation Schriftsteller
Beiträge: 595
|
Ja solche Makros sind eine feine Sache, danke für den Tip !
Mehr Ausgänge brauch ich nicht, 4 sind da schon völlig ausreichend, somit lass ich das so mit den Buttons.
Ach eines noch, warum hängt er eigentlich in der Schleife wenn ich eine blink LED einfüge ?
Ich hab doch nur eine 2. Funktion drangehängt.
Code : |
//EEPROM löschen
if(BUTTON_INPUT == 0 && BUTTON_INPUT2 == 0)
{
for(unsigned short byte = 0; byte < 256; byte++)
{
eeprom_write(byte, 0xFF);
__delay_ms(50);
GREEN_LED = ON;
__delay_ms(50);
GREEN_LED = OFF;
}
} |
|
|
BID = 936482
Maik87 Schriftsteller
Beiträge: 856 Wohnort: Wesel / Niederrhein
|
Sicher, dass er hängt?
Die Schleife wird 256mal durchlaufen. Du verzögerst jeden Durchlauf um 100ms. Somit erreichst du allein eine Verzögerung von 25,6 Sekunden OHNE dass der IC nur das kleinste bisschen gearbeitet hat.
|
BID = 936484
trafostation Schriftsteller
Beiträge: 595
|
Achso, na klar !, hab es zum Testen auf 10ms verringert, funktioniert also doch !
Ha !, was aber wenn die LED jetzt sagen wir mal, 5 Sekunden lang mit einer Frequenz von 50ms blinken soll, während des Löschvorgangs und danach die Schleife verlassen soll ?
|
BID = 936486
Maik87 Schriftsteller
Beiträge: 856 Wohnort: Wesel / Niederrhein
|
Ich wusste, dass die Frage kommt
Modulo ist das Stichwort 😉
|
BID = 936489
trafostation Schriftsteller
Beiträge: 595
|
Zitat :
| Modulo ist das Stichwort |
Ah, sicher ein neuer italienischer Sportwagen !...in 5sek von 0-100
|