Autor |
1-Wire Projekt, Code Hilfe C |
|
|
|
|
BID = 936490
Maik87 Schriftsteller
Beiträge: 856 Wohnort: Wesel / Niederrhein
|
|
BID = 936497
trafostation Schriftsteller
Beiträge: 595
|
|
Ui, Mathe ist nicht mein Gebiet, deshalb eine Pfusch Lösung
Das klappt auch...
Code : |
if(BUTTON_INPUT == 0 && BUTTON_INPUT2 == 0)
{
for(unsigned short byte = 0; byte < 256; byte++)
{
eeprom_write(byte, 0xFF);
if(BUTTON_INPUT == 0 && BUTTON_INPUT2 == 0)
{
__delay_ms(100);
GREEN_LED = ON;
__delay_ms(100);
GREEN_LED = OFF;
}
}
} |
|
|
|
BID = 936498
Maik87 Schriftsteller
Beiträge: 856 Wohnort: Wesel / Niederrhein
|
Und jetzt in schön :
Code : |
//EEPROM löschen
if(BUTTON_INPUT == 0 && BUTTON_INPUT2 == 0){
for(unsigned short byte = 0; byte < 256; byte++)
{
eeprom_write(byte, 0xFF);
if((byte%5)==0){
__delay_ms(50);
GREEN_LED = ON;
__delay_ms(50);
GREEN_LED = OFF;
}
}
}
|
|
Wie funktioniert das??
Edit:
Kleiner Denkansatz:
Code : |
//EEPROM löschen
if(BUTTON_INPUT == 0 && BUTTON_INPUT2 == 0){
GREEN_LED = ON; //Achtung, mach so weiter und ich lösche den EEPROM!
__delay_ms(1000);
GREEN_LED = OFF;
if(BUTTON_INPUT == 0){
for(unsigned char byte = 0; byte < 128; byte++)
{
eeprom_write(byte, 0xFF);
if((byte%5)==0){
__delay_ms(50);
GREEN_LED = ON;
__delay_ms(50);
GREEN_LED = OFF;
}
}
}
if(BUTTON_INPUT2 == 0){
for(unsigned char byte = 0; byte < 128; byte++)
{
eeprom_write((byte+128), 0xFF);
if((byte%5)==0){
__delay_ms(50);
GREEN_LED = ON;
__delay_ms(50);
GREEN_LED = OFF;
}
}
}
}
|
|
Bewusst noch optimierbar
Sollst ja auch noch was lernen...
[ Diese Nachricht wurde geändert von: Maik87 am 1 Sep 2014 20:07 ]
[ Diese Nachricht wurde geändert von: Maik87 am 1 Sep 2014 20:08 ]
[ Diese Nachricht wurde geändert von: Maik87 am 1 Sep 2014 20:11 ]
|
BID = 936503
trafostation Schriftsteller
Beiträge: 595
|
Funktioniert hervorragend, 1:0 für dich !
Da hat man als Pfuscher keine Chance mehr
Jetzt wo ich das sehe, sieht das eigentlich sehr einfach aus, ich dachte da müsste man komplizierte Berechnungen und Code Verschachtelungen einbauen, wie ich das so gelesen habe.
Bloß wissen muss man es halt.
Da kann man stundenlang rätseln und lesen, oder es es zeigt einem jemand in ein paar Sekunden wie es geht
Ich will dir aber nicht länger deine Zeit stehlen, hab dich schon über Gebühr beansprucht !
PS: zweite Variante ist auch cool !
[ Diese Nachricht wurde geändert von: trafostation am 1 Sep 2014 20:16 ]
|
BID = 936504
Maik87 Schriftsteller
Beiträge: 856 Wohnort: Wesel / Niederrhein
|
Zitat :
trafostation hat am 1 Sep 2014 20:11 geschrieben :
|
Funktioniert hervorragend, 1:0 für dich !
|
Nee, du sollst mir erklären, wie es funktioniert!
Will mal dein Verständnis checken
Zitat :
|
Ich will dir aber nicht länger deine Zeit stehlen, hab dich schon über Gebühr beansprucht !
|
Och man - macht gerade soo Spaß!
PS: Hab den Code nochmal verändert - war an einer Stelle etwas ungünstig.
|
BID = 936507
trafostation Schriftsteller
Beiträge: 595
|
Ich versuchs mal sinngemäß, wenn die Löschaktion startet(byte 0) wird 5 Sekunden gezählt bzw. entsprechend solange ausgeführt, und währenddessen der Blinkcode mit den 50ms ausgeführt.
Na ja wenn dir langweilig ist, 1 und 2 getrennt voneinander löschen wäre eine sinnvolle Optimierung.
Theoretisch müsste dann jeweils nur die Hälfte des EEPROM Speichers gelöscht werden, oder ?, also einmal von 0-128, und von 129- 256, oder ist das ein dummer Denkfehler ?
|
BID = 936509
Maik87 Schriftsteller
Beiträge: 856 Wohnort: Wesel / Niederrhein
|
Zitat :
trafostation hat am 1 Sep 2014 20:39 geschrieben :
|
Ich versuchs mal sinngemäß, wenn die Löschaktion startet(byte 0) wird 5 Sekunden gezählt bzw. entsprechend solange ausgeführt, und währenddessen der Blinkcode mit den 50ms ausgeführt.
|
Sowas von falsch
Zwei Tipps:
1. in der Variable byte wird von 0 - 255 gezählt
2. modulo rechnet den Rest einer Division!
Zitat :
|
Na ja wenn dir langweilig ist
|
"Langweilig" ist übertrieben - aber es macht Spaß
Zitat :
|
1 und 2 getrennt voneinander löschen wäre eine sinnvolle Optimierung.
|
Joahr! Schau mal weiter oben - vllt hab ich dazu schon einmal eine Idee gehabt
Zitat :
|
Theoretisch müsste dann jeweils nur die Hälfte des EEPROM Speichers gelöscht werden, oder ?,
|
Praktisch sogar auch
Zitat :
|
also einmal von 0-128, und von 129- 256,
|
Nicht ganz!
Von 0 bis 256 sind 257 Ziffern/Adressen. Wir haben aber nur 256!!
0 bis 127 und 128 bis 255
Oder um es "kompliziert" auszudrücken:
0 bis 127 und (0+128) bis (127+128)
oder (um dich entweder ganz zu verwirren oder direkt auf den richtigen Weg zu bringen:
(0+0*128) bis (127+0*128) und (0+1*128) bis (127+1*128)
Dämmert es?
Zitat :
|
oder ist das ein dummer Denkfehler ?
|
Nööö!
[ Diese Nachricht wurde geändert von: Maik87 am 1 Sep 2014 21:04 ]
|
BID = 936512
trafostation Schriftsteller
Beiträge: 595
|
Oh Mann, da hab ich doch den Code glatt übersehen, ist ja schon alles da ! , ich hab den Arbeitsrechner schon heruntergefahren, teste das dann morgen.
Hm, Moment, was wird denn da dann dividiert, byte ?
Eh klar, die 0 zählt natürlich auch !
|
BID = 936514
Maik87 Schriftsteller
Beiträge: 856 Wohnort: Wesel / Niederrhein
|
Der Inhalt der Variable byte wird durch 5 geteilt...
Weiter?
|
BID = 936555
trafostation Schriftsteller
Beiträge: 595
|
Krass, ich habe mich aus zwei PICs ausgesperrt
Die werden vom Programmer nicht mehr erkannt, seitdem ich den ersten Teil vom Lösch Code entfernt habe, so das man nur jeweils einen Button drücken muss, wenn man 1 oder 2 löschen will.
Code : |
//EEPROM löschen
if(BUTTON_INPUT == 0){
for(unsigned char byte = 0; byte < 128; byte++)
{
eeprom_write(byte, 0xFF);
if((byte%5)==0){
__delay_ms(50);
GREEN_LED = ON;
__delay_ms(50);
GREEN_LED = OFF;
}
}
}
if(BUTTON_INPUT2 == 0){
for(unsigned char byte = 0; byte < 128; byte++)
{
eeprom_write((byte+128), 0xFF);
if((byte%5)==0){
__delay_ms(50);
GREEN_LED = ON;
__delay_ms(50);
GREEN_LED = OFF;
}
}
}
}
|
|
Interessant, wenn ich den Programmer(ein serieller JDM Selbstbau) anstecke startet der PIC das Löschprogramm, das erkennt man an der LED.
Egal ob der PIC in circuit oder direkt am Programmer hängt,er wird nicht mehr erkannt.(in der Schaltung funktioniert er aber normal)
Es nützt auch nichts wenn die Buttons mit dem Pullup auf high sind, eigentlich sollte er dann nichts machen.
Erst dachte ich ein PIC ist hin, aber beim zweiten ist dann das gleiche passiert. Programmer ist OK und arbeitet mit anderen PIC normal.
Ich habe sowieso vor mir einen USB PICkit clone zu bauen, vielleicht lassen sich die beiden PICs damit wieder löschen.
|
BID = 936560
Maik87 Schriftsteller
Beiträge: 856 Wohnort: Wesel / Niederrhein
|
Wie funktioniert die Programmierung überhaupt? Ich seh keine Reset-Leitung!
Hast du an den Fuse-bits rumgespielt?
Im übrigen hast du dich verklammert - eine } am Ende zu viel.
Zitat :
| Interessant, wenn ich den Programmer(ein serieller JDM Selbstbau) anstecke startet der PIC das Löschprogramm, das erkennt man an der LED.
Egal ob der PIC in circuit oder direkt am Programmer hängt,er wird nicht mehr erkannt.(in der Schaltung funktioniert er aber normal)
Es nützt auch nichts wenn die Buttons mit dem Pullup auf high sind, eigentlich sollte er dann nichts machen.
|
Scheibar startet der PIC das Programm und der Programmer "spielt" den Button. Poste mal die Belegung für die Programmierung des PICs.
[ Diese Nachricht wurde geändert von: Maik87 am 2 Sep 2014 16:46 ]
|
BID = 936561
trafostation Schriftsteller
Beiträge: 595
|
Mit der Code Protection hat das nichts zu tun, da ist nichts aktiviert, selbst wenn, auch geschützte PIC werden immer vom Programmer erkannt, nur aulesen geht dann nicht.
Das mit der Klammer weiß ich, ist nur in dem hier eingefügten Code zuviel.
Ja genau, der Programmer scheint sich damit zu spielen
Ich verwende exakt diese Schaltung:
2 neue PIC habe ich noch, jetzt versuche ich nochmal den alten Code
edit: mit dem alten Code(und normaler EEPROM Löschfunktion) klappt alles.
[ Diese Nachricht wurde geändert von: trafostation am 2 Sep 2014 17:05 ]
|
BID = 936563
Maik87 Schriftsteller
Beiträge: 856 Wohnort: Wesel / Niederrhein
|
Wieso der PIC das Programm startet - keine Ahnung. Leider hat der PIC auch keinen RESET-Eingang, um ihn daran zu hindern.
Wenn er aber wirklich das Programm startet und mit dem alten Code (zwei Tasten) nicht in das Löschen gegagengen ist - wieso ist er dann nicht in die main-loop gelaufen und hat sich dennoch programmieren lassen?
Ich bin raus - sorry
Edit:
Was passiert, wenn du VOR die Löschabfrage die LED kurz blinken lässt?
Dann könnte man sehen, ob das Programm immer erst gestartet wird und das Problem tatsächlich der einzelne "Tastendruck" ist oder ob wir ganz wo ander philosofieren müssen.
[ Diese Nachricht wurde geändert von: Maik87 am 2 Sep 2014 17:11 ]
|
BID = 936567
trafostation Schriftsteller
Beiträge: 595
|
Meinst du die LED mit dem alten Code, oder mit dem "Killer" Code ?, noch einen möchte ich eigentlich nicht abschießen.
|
BID = 936568
Maik87 Schriftsteller
Beiträge: 856 Wohnort: Wesel / Niederrhein
|
Zitat :
trafostation hat am 2 Sep 2014 17:35 geschrieben :
|
Meinst du die LED mit dem alten Code, oder mit dem "Killer" Code ?, noch einen möchte ich eigentlich nicht abschießen.
|
Der alte!
Mich würde interessieren, ob generell erst das Programm anläuft und dann die Programmierung startet oder ob das nur in dem neuen Code der Fall ist.
In der Hoffnung, dass nicht der nächste PIC
|