Not logged in. · Lost password · Register

Page:  1  2  next 
holzblock
Member since Oct 2010
21 posts
Subject: Juli 2010 Konfigurierbarer Würfel
Hi!
Ich glaube die Aufgabe war schon in der Übung dran aber da war ich nicht da! Hier meine Lösung. Ich habe vor allem Probleme mit der Button Callback-Funktion, die wird so höchstwahrscheinlich nicht funtkionieren. Hab leider keine Ahnung wie ich das sonst machen soll?

  1. uint8_t n = 1;
  2. uint8_t max;
  3. uint8_t button = 0;
  4.  
  5. void wait(void);
  6. void init(void);
  7. void btnpressed(void);
  8. void registerCallbackButton0(void (*callback)(void));
  9.  
  10. void main(void){
  11.    
  12.     init();
  13.     registerCallbackButton0(btnpressed());
  14.    
  15.     //Initialisierungsphase
  16.     while(button == 0){     
  17.         sei();
  18.         PORTC &= ~(1<<(n-1));
  19.         n++;
  20.         wait();
  21.         if(n == 8){
  22.              n = 1;
  23.              PORTC |= 0xff;
  24.         }
  25.         cli();
  26.        
  27.     }
  28.     button = 0;  
  29.     max = n;
  30.     PORTC = 0xff;   
  31.    
  32.     //Wuerfelphase
  33.     while(1){
  34.         sei();
  35.         while(button == 0)  {
  36.             static uint8_t i=0;
  37.             PORTC ^= (1<<i);
  38.             if(i == max-1){
  39.                 i = 0;
  40.             }
  41.            
  42.         }      
  43.         cli();
  44.         button = 0;
  45.         while(button == 0)  {
  46.             sleep_enable();
  47.             sei();
  48.             sleep_cpu();
  49.             sleep_disable();
  50.             cli();
  51.            
  52.         }   
  53.         button = 0;
  54.     }
  55. }
  56.  
  57. void init(void){
  58.  
  59.     DDRC |= 0xff;
  60.     PORTC |= 0xff;
  61.    
  62.     
  63. }
  64.  
  65. void btnpressed(void){  //Callback-Funktion
  66.     button = 1;
  67. }
  68.  
  69. void wait(void){
  70.     for(uint8_t i = 0; i < 1000; i++){
  71.         ;
  72.     }
  73. }


EDIT: So müsste es aber funktionieren oder??
This post was edited 2 times, last on 2011-08-01, 15:15 by holzblock.
Steppenwolf
GSPiC-Übungsleiter
Member since May 2011
31 posts
Auf den ersten Blick sehe ich auch im Wesentlichen das Callback-Problem, ja. Das funktioniert so tatsaechlich nicht, dass du mit einem "break" in der Callback-Funktion versuchst, aus der Endlos-Schleife im Hauptprogramm zu springen, weil der Compiler in der Callback-Funktion keine Schleife sieht, aus der er herausspringen kann.

Wie koenntest du denn sonst die Information, dass der Taster gedrueckt wurde, an das Hauptprogramm weitergeben?
morty
SPiC-Meister
(Moderator)
Member since May 2011
331 posts
In reply to post #1
registerCallbackButton0(btnpressed());
Hier übergibst du nicht die Funktion, sondern den Rückgabewert der Funktion btnpressed an registerCallbackButton0..... - Du willst aber einen Zeiger auf die Funktion übergeben.
holzblock
Member since Oct 2010
21 posts
Also müsste es dann so heißen:   
  1. registerCallbackButton0(btnpressed);
Oder?
morty
SPiC-Meister
(Moderator)
Member since May 2011
331 posts
Quote by holzblock:
Also müsste es dann so heißen:   
  1. registerCallbackButton0(btnpressed);
Oder?
oder eigentlich schöner wäre
  1. registerCallbackButton0(&btnpressed);
C erlaubt das & wegzulassen, weil man Funktionen nicht übergeben kann, sondern nur Pointer auf diese.....
holzblock
Member since Oct 2010
21 posts
Alles klar! Vielen Dank! Schaut sonst soweit alles gut aus?
Markus A
Member since Apr 2011
5 posts
Fehlt da nicht noch ein volatile in Zeilen 3 und 70?
Christian St.
Member since May 2011
212 posts
Seh ich auch so.
D.Kay
Member since Oct 2010
15 posts
In reply to post #1
Außerdem solltest du über ein "static" bei den globalen Variablen nachdenken.
Warum togglest du in der Würfelphase (Zeile 37) die Zustände? Es sollte nur die entsprechende LED leuchten, denke ich. Noch mal die Aufgabenstellung anschauen.
holzblock
Member since Oct 2010
21 posts
hi!
ja das mit dem static stimmt! aber in zeile 37 leuchtet doch immer nur eine led oder nicht? was noch fehlt ist das i++ in der schleife!

edit: sry mein fehler du hast recht! dann halt einfach PORTC = ~(1<<i)
This post was edited on 2011-08-04, 14:43 by holzblock.
misc
Member since Jul 2011
13 posts
Quote by holzblock:
hi!
ja das mit dem static stimmt! aber in zeile 37 leuchtet doch immer nur eine led oder nicht? was noch fehlt ist das i++ in der schleife!

edit: sry mein fehler du hast recht! dann halt einfach PORTC = ~(1<<i)

doch, das i++ fehlt! und das PORTC ^= (1<<i); ist doch auch falsch oder? PORTC = ~(1<<i) wäre richtig, aber ein i++ brauchts doch trotzdem noch?

sollte das sei(); in Zeile 34 nicht erst nach dem while(button == 0) kommen? sonst greift dieses  while(button == 0) ja auf eine globale variable zu, während die interrupts noch an sind?

du könntest deinen ersten beitrag ja mal editieren und alle korrekturen einbauen ;)
This post was edited on 2011-08-04, 20:59 by misc.
JoBinder
Member since Dec 2010
9 posts
Subject: Maximale Würfelzahl wird nicht erreicht
Hallo,

weil in Zeile 21-23 n auf 1 gesetzt wird, wenn es 8 war, wirst du nie bis 8 würfeln können...

es wäre besser, wenn man die Rücksetzabfrage vor die Anzeige setzt, ebenso das n++ (dann müsste man mit n=0 beginnen), sonst ist ja das maximum wiederum um eins höher, als man es gesehen hat...

Beispiel: es leuchten 7 LEDs, Knopf wird gedrückt: dann wird aber noch n auf 8 gesetzt und dann auch noch auf 1...

oder täusche ich mich?
morty
SPiC-Meister
(Moderator)
Member since May 2011
331 posts
In reply to post #11
Quote by misc:
doch, das i++ fehlt! und das PORTC ^= (1<<i); ist doch auch falsch oder? PORTC = ~(1<<i) wäre richtig, aber ein i++ brauchts doch trotzdem noch?

Jep!


Quote by misc:
sollte das sei(); in Zeile 34 nicht erst nach dem while(button == 0) kommen? sonst greift dieses  while(button == 0) ja auf eine globale variable zu, während die interrupts noch an sind?

Das ist richtig, aber hier ist das kein Problem, da button0 ein 8-bit wert ist, also keine kaputten Werte gelesen werden können.  Und ein Lost-Wakeup haben wir hier auch nicht, da der Interrupt überall innerhalb der Schleife einschlagen kann, ohne das es Probleme gibt. Sperren wäre hier also falsch.

Nachtrag: das Sperren um die Schleife in Zeile 16 ist überflüssig.....
This post was edited on 2011-08-05, 09:54 by morty.
morty
SPiC-Meister
(Moderator)
Member since May 2011
331 posts
In reply to post #12
Quote by JoBinder:
Hallo,

weil in Zeile 21-23 n auf 1 gesetzt wird, wenn es 8 war, wirst du nie bis 8 würfeln können...

Jep.

Quote by JoBinder:
es wäre besser, wenn man die Rücksetzabfrage vor die Anzeige setzt, ebenso das n++ (dann müsste man mit n=0 beginnen), sonst ist ja das maximum wiederum um eins höher, als man es gesehen hat...

Hier gibt es verschiedenste Lösungen, die je nach Erfahrung des Programmierers besser oder schlechter zu lesen sind. Ich würd' zum Beispiel immer n = (n +1) % 8 schreiben, weil ich dann sicher weiß, dass der Wertebereich passt. ;)
morty
SPiC-Meister
(Moderator)
Member since May 2011
331 posts
In reply to post #11
Quote by misc:
du könntest deinen ersten beitrag ja mal editieren und alle korrekturen einbauen ;)

Ein neuer Beitrag mit den Korrekturen ist besser, weil man dann die Kommentare besser nachvollziehen kann. Aber jetzt ist's wohl eh zu spät. ;)
Close Smaller – Larger + Reply to this post:
Verification code: VeriCode Please enter the word from the image into the text field below. (Type the letters only, lower case is okay.)
Smileys: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O :troll:
Special characters:
Page:  1  2  next 
Go to forum
Powered by the Unclassified NewsBoard software, 20110527-dev, © 2003-8 by Yves Goergen