Nicht angemeldet. · Kennwort vergessen · Registrieren

pm
Mitglied seit 02/2011
7 Beiträge
Betreff: Juli2008 Lauflicht
Hallo,
wenn ich mein Programm teste, leuchten nur 3 der Leds. Ich weiß aber nicht warum. Hat vll jmd eine idee? An meinem Board dürfte es nicht liegen, da ich ein anderes Programm getestet habe und dort alle Leds funktionierten.
Hier der code:

  1. 1 #include <avr/interrupt.h>
  2. 2 #include <avr/io.h>
  3. 3 #include <avr/sleep.h>
  4. 4
  5. 5 void init(void);
  6. 6 void wait(uint16_t);
  7. 7
  8. 8 static uint16_t gesch = 5000;
  9. 9 static uint16_t mom = 0;
  10. 10 static volatile uint8_t event=0;
  11. 11
  12. 12 ISR(INT0_vect){
  13. 13  if (event == 0 && gesch <10000){
  14. 14    gesch = gesch + 1000;
  15. 15    event = 1;
  16. 16  }
  17. 17  
  18. 18 }
  19. 19
  20. 20 void main(void){
  21. 21  init();
  22. 22  while(1){
  23. 23    mom = gesch;
  24. 24    for(uint8_t a = 0; a<8;a++){
  25. 25      PORTA |= 0xff;
  26. 26      PORTA &=~(1<<a);
  27. 27      wait(mom);
  28. 28    }
  29. 29    PORTA|=0xff;
  30. 30    cli();
  31. 31    if(event == 0 && gesch >1000){ //es wurde während des durchlaufs nicht gedrückt, max noch nicht erreicht
  32. 32      gesch = gesch-1000;
  33. 33      sei();
  34. 34    }else{
  35. 35      if(gesch == 1000){//max erreicht, gedrückt egal
  36. 36        cli();
  37. 37        while(event == 0){
  38. 38          sleep_enable();
  39. 39          sei();
  40. 40          sleep_cpu();
  41. 41          sleep_disable();
  42. 42          cli();
  43. 43        }
  44. 44        sei();
  45. 45        gesch = 5000;
  46. 46      }//max nicht erreicht, es wurde gedrückt
  47. 47    }
  48. 48    event = 0;
  49. 49  }
  50. 50 }
  51. 51
  52. 52 void init(void){
  53. 53  DDRA |= 0xff;
  54. 54  DDRD &= ~(1<<2);
  55. 55  
  56. 56  PORTD |=(1<<2);
  57. 57  PORTA |= 0xff;
  58. 58  
  59. 59  GICR |=(1<<INT0);
  60. 60  MCUCR |=(1<<ISC01);
  61. 61  MCUCR |=(1<<ISC00);
  62. 62  sei();
  63. 63
  64. 64 }
  65. 65
  66. 66 void wait(uint16_t interval){
  67. 67  for (volatile uint16_t i = 0; i<interval; i++);
  68. 68 }

Danke!
patkan
FSI EEI, FabLab
(Administrator)
Mitglied seit 10/2010
170 Beiträge
Wenn ich das richtig lese, sind an diesem fiktiven Board die LEDs an PORT A.
Am echten Board sind die aber aus purer Boshaftigkeit - um es für den armen Studenten schwer zu machen^^ (vermutlich auch, weil es sich so vernünftiger layouten lässt ;-) ) auf verschiedene Boards verteilt.
Was also passiert ist, dass du zufällig ein paar richtige erwischt und ansonsten leere Ports, Schalter, etc unter Strom setzt (kp, was da alles dranhängt an PORT A)
pm
Mitglied seit 02/2011
7 Beiträge
Danke für die schnelle Antwort!
Daran habe ich nicht gedacht...
Aber würde mein Code die Aufgabenstellung erfüllen?
morty
SPiC-Meister
(Moderator)
Mitglied seit 05/2011
331 Beiträge
Hab da ein paar Fragen:
  • Warum schaltest du erst alle LEDs aus um dann eine wieder einzuschalten (ist nicht wirklich falsch, aber aufwendiger als nötig).
  • Wo steht im Text, dass die LEDs nach dem Durchlauf wieder ausgeschaltet werden?
  • Wo steht im Text, dass der Lauf nicht schneller werden muss, wenn die Taste gedrückt wurde? (Ich interpretiere den so: Wenn drücken, dann eine Stufe langsamer, wenn Runde zuende eine Stufe schneller -> Einmal drücken = gleich schnell.....)
Ansonsten sieht es ganz gut aus.
pm
Mitglied seit 02/2011
7 Beiträge
zu 1) kann ich statt Zeile 25 und 26 schreiben: PORTA = 0xff &(~(1<<a)); ?
zu 2) eigentlich nirgends ;)
zu 3) ich hab es so interpretiert, dass es entweder um eine Stufe langsamer oder schneller wird... wenn ich Zeile 31 zu  if(gesch > 1000) ändere, müsste es passen?
morty
SPiC-Meister
(Moderator)
Mitglied seit 05/2011
331 Beiträge
Zitat von pm:
zu 1) kann ich statt Zeile 25 und 26 schreiben: PORTA = 0xff &(~(1<<a)); ?

Oder einfach  PORTA = ~(1<<a);

Zitat von pm:
zu 3) ich hab es so interpretiert, dass es entweder um eine Stufe langsamer oder schneller wird... wenn ich Zeile 31 zu  if(gesch > 1000) ändere, müsste es passen?
Sollte. Aber es fällt auch sonst ein wenig code weg....
Kamu
Mitglied seit 11/2010
29 Beiträge
Bekommen wir nicht Minuspunkte, wenn wir sinnlos Speicher vollhauen?

Imo kann man "uint16_t mom" lokal machen.
Und mit einer anderen Programmierung ist auch "event" unnötig.

Btw. In der Aufgabe steht, dass im Ausgangszustand die Pin0 LED leuchten soll,
D.h. in der Initialisierung sollte PORTA=0xfe sein imo

Und muss um das mom=gesch nicht ein cli() + sei() ?
Wegen read-write anomalie?
Dieser Beitrag wurde am 04.08.2011, 16:09 von Kamu verändert.
morty
SPiC-Meister
(Moderator)
Mitglied seit 05/2011
331 Beiträge
Zitat von Kamu:
Bekommen wir nicht Minuspunkte, wenn wir sinnlos Speicher vollhauen?

Jep.

Zitat von Kamu:
Imo kann man "uint16_t mom" lokal machen.
Und mit einer anderen Programmierung ist auch "event" unnötig.

Sehe ich genauso.

Zitat von Kamu:
Btw. In der Aufgabe steht, dass im Ausgangszustand die Pin0 LED leuchten soll,
D.h. in der Initialisierung sollte PORTA=0xfe sein imo
Da die zeit zwischen init und der Schleife sehr kurz ist, ist das ok, solange die richtig LED am Anfang leuchtet.


Zitat von Kamu:
Und muss um das mom=gesch nicht ein cli() + sei() ?
Wegen read-write anomalie?

Ist keine Anomalie, aber du hast recht.
Schließen Kleiner – Größer + Auf diesen Beitrag antworten:
Prüfcode: VeriCode Gib bitte das Wort aus dem Bild ins folgende Textfeld ein. (Nur die Buchstaben eingeben, Kleinschreibung ist in Ordnung.)
Smileys: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O :troll:
Weitere Zeichen:
Gehe zu Forum
Powered by the Unclassified NewsBoard software, 20110527-dev, © 2003-8 by Yves Goergen