Nicht angemeldet. · Kennwort vergessen · Registrieren

Baum
Mitglied seit 07/2013
8 Beiträge
Betreff: Klausur August 2011
Könnte auch das jemand korrigieren? :)

  1. /*Funktionsdeklarationen*/
  2. uint16_t poti_read(void);
  3. void wait(void);
  4. void init(void);
  5. uint8_t taster;
  6.  
  7. /*Unterbrechungsbehandlungsfunktion*/
  8. ISR(INT0_vect){
  9.     taster = 1;
  10. }
  11.  
  12.  
  13. /*Funktion main*/
  14. void main(void){
  15.     /*Initialisierung und lokale Variablen*/
  16.     uint16_t pot;
  17.     uint16_t ledWert;
  18.     init();
  19.  
  20.     /*Hauptschleife*/
  21.     while(1){
  22.  
  23.         /*Konfigurationsphase*/
  24.         while(taster ==0){
  25.             pot = poti_read(void);
  26.             ledWert = pot/128+1;
  27.             //hier schon LEDs anzeigen ??(entnehme ich der Aufgabe nicht)
  28.             for(uint8_t i = 0; i<ledWert; i++){
  29.                 PORTB &= ~(1<<i);
  30.             }
  31.         }
  32.         /*Countdown-Phase*/ 
  33.         taster = 0;
  34.         while(ledWert!=0){
  35.             wait();
  36.             for(uint8_t i =0; i<ledWert; i++){
  37.                 PORTB &= ~(1<<i);
  38.             }
  39.             for(uint8_t i= ledWert; i<8; i++){
  40.                 PORTB |= (1<<i);
  41.             }
  42.             ledWert--;
  43.             if(taster) break;
  44.         }
  45.  
  46.  
  47.         /*LED-Alarm-Sequenz*/
  48.         if(taster==0){
  49.             PORTB = 0xaa;
  50.             wait();
  51.             PORTB = ~PORTB;
  52.             wait();
  53.         }
  54.         /*Schlafphase*/
  55.         cli();
  56.         taster = 0;
  57.         while(taster ==0){
  58.             sei();
  59.             sleep_cpu();
  60.             cli();
  61.         }
  62.         sei();
  63.     }
  64. }
  65. /*Initialisierungsfunktion*/
  66. void init(void){
  67.     DDRB = 0xff;
  68.     PORTB = 0xff;
  69.     DDRD &= ~(1<<2);
  70.     PORTD |= (1<<2);
  71.     GICR |= (1<<INT0);
  72.     MCUCR &= ~(1<<ISC00);
  73.     MCUCR |= (1<<ISR01);
  74.     sleep_enable();
  75.     sei();
  76.  
  77. }
  78.  
  79. /*Wartefunktion*/
  80. void wait(void){
  81.     for(volatile uint16_t i; i<60000; i++){}
  82. }
morty
SPiC-Meister
(Moderator)
Mitglied seit 05/2011
331 Beiträge
Dein Programm wird die Konfigurationsphase nie verlassen! - Zumindest wenn der Compiler optimieren darf.
2:: Bibliotheksfunktionen müssen nicht nochmal deklariert werden - die werden ja von uns gestellt.
51: Das ist mal deutlich schöner als in unserer Musterlösung!
Der Rest sieht ok aus.
nemrak300693
Mitglied seit 09/2012
13 Beiträge
Betreff: Aufgabe 3 a)
Es würde mich freuen, wenn mir jmd. hierbei hilft :) :
Ich würde gerne wissen wo die Variablen "e" und "f" abgespeichert werden.
Zu e:
Es werden ja alle uninitialisierten Variablen in .bss gelegt und alle initialisierten mit globaler Lebensdauer in .data .
Die Variable e ist in dieser Aufgabe eine mit globaler Lebensdauer, aber uninitialisiert.
Wird diese nun in .bss angelegt oder in .data?

Zu f:
Ist es richtig so, dass diese in den stack kommt?
Wenn es keine Pointer wäre wäre es trivial erkennbar, aber ich würde gerne wissen ob ein Pointer wo anders im Speicher abgelegt wird.
Raim
GSPiC-Guru
Mitglied seit 05/2011
79 Beiträge
Zitat von nemrak300693 am 27.07.2013, 11:01:
Zu e:
Es werden ja alle uninitialisierten Variablen in .bss gelegt und alle initialisierten mit globaler Lebensdauer in .data .
Die Variable e ist in dieser Aufgabe eine mit globaler Lebensdauer, aber uninitialisiert.
Wird diese nun in .bss angelegt oder in .data?

In .bss landen nur globale, uninitialisierte Variablen (und sogar auch solche, die explizit mit 0 initialisiert wurden). Eine uninitialisierte lokale Variable bleibt natürlich auf dem Stack.

Zu f:
Ist es richtig so, dass diese in den stack kommt?
Wenn es keine Pointer wäre wäre es trivial erkennbar, aber ich würde gerne wissen ob ein Pointer wo anders im Speicher abgelegt wird.

Der Typ einer Variable hat keinen Einfluss darauf, wo diese abgelegt wird.
Horst
Mitglied seit 04/2012
13 Beiträge
Antwort auf Beitrag #1
Hi
nochmal eine Frage zu der Programmieraufgabe.
Im speziellen zur Zeile 26,
 ledWert = pot/128+1;
Wie komme ich auf die 128?
Mein weiß ja nur das der poti Wert ein 10 bit Wert ist, oder?
Wäre es auch moeglich hier
ledWert = pot/((0b1111111111)/8)+1;
zu schreiben?
Würde mich über eine Antwort freuen.
Raim
GSPiC-Guru
Mitglied seit 05/2011
79 Beiträge
Im C-Standard sind Konstanten nur als dezimal (42), oktal (052) oder hexadezimal (0x2a) vorgesehen. Im gcc wird darüber hinaus auch die binäre Schreibweise (0b101010) akzeptiert, das ist allerdings eine Erweiterung über den C-Standard hinaus und wird von anderen Übersetzern nicht unbedingt akzeptiert.

Deine Herleitung der 128 ist fast richtig, nur musst du beachten, dass sich mit 10 Bit 1024 verschiedene Werte darstellen lassen (0 bis 1023). Der vorgeschlagene Term 0b1111111111/8, also dezimal 1023/8, ergibt nämlich nicht 128.
muffdey
Mitglied seit 04/2012
12 Beiträge
Hallo,

Laut Aufgabenstellung beginnt der Countdown mit den eingestellten LED`s nach einem (dem ersten) Tasterdruck. So wie ich das verstehe beginnt bei dem Code von Baum die Countdownphase mit while(ledWert!=0).
D.h. sofort nachdem eine LedWert mit dem Poti ausgelesen wurde fängt der Countdown an, ohne Tastendruck. Verstehe ich das richtig?

Ich dachte es sollte ungefähr so aussehen: while(ledWert!=0 && taster=1){..}

Bitte um Antwort.

Viele Grüße

Muffdi
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