1-Wire Projekt, Code Hilfe C

Im Unterforum Microcontroller - Beschreibung: Hardware - Software - Ideen - Projekte

Elektronik Forum Nicht eingeloggt       Einloggen       Registrieren




[Registrieren]      --     [FAQ]      --     [ Einen Link auf Ihrer Homepage zum Forum]      --     [ Themen kostenlos per RSS in ihre Homepage einbauen]      --     [Einloggen]

Suchen


Serverzeit: 29 3 2024  10:22:27      TV   VCR Aufnahme   TFT   CRT-Monitor   Netzteile   LED-FAQ   Osziloskop-Schirmbilder            


Elektronik- und Elektroforum Forum Index   >>   Microcontroller        Microcontroller : Hardware - Software - Ideen - Projekte

Gehe zu Seite ( Vorherige Seite 1 | 2 | 3 | 4 | 5 Nächste Seite )      


Autor
1-Wire Projekt, Code Hilfe C

    







BID = 936459

Maik87

Schriftsteller



Beiträge: 851
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: 590

 

  

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: 851
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: 590

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: 851
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: 851
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: 590

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: 851
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: 590

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: 851
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: 590

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: 851
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: 590

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: 851
Wohnort: Wesel / Niederrhein

Ich wusste, dass die Frage kommt
Modulo ist das Stichwort 😉

BID = 936489

trafostation

Schriftsteller



Beiträge: 590


Zitat :
Modulo ist das Stichwort

Ah, sicher ein neuer italienischer Sportwagen !...in 5sek von 0-100


Vorherige Seite       Nächste Seite
Gehe zu Seite ( Vorherige Seite 1 | 2 | 3 | 4 | 5 Nächste Seite )
Zurück zur Seite 0 im Unterforum          Vorheriges Thema Nächstes Thema 


Zum Ersatzteileshop


Bezeichnungen von Produkten, Abbildungen und Logos , die in diesem Forum oder im Shop verwendet werden, sind Eigentum des entsprechenden Herstellers oder Besitzers. Diese dienen lediglich zur Identifikation!
Impressum       Datenschutz       Copyright © Baldur Brock Fernsehtechnik und Versand Ersatzteile in Heilbronn Deutschland       

gerechnet auf die letzten 30 Tage haben wir 22 Beiträge im Durchschnitt pro Tag       heute wurden bisher 3 Beiträge verfasst
© x sparkkelsputz        Besucher : 180688307   Heute : 4201    Gestern : 12674    Online : 482        29.3.2024    10:22
12 Besucher in den letzten 60 Sekunden        alle 5.00 Sekunden ein neuer Besucher ---- logout ----viewtopic ---- logout ----
xcvb ycvb
0.0585970878601