Not logged in. · Lost password · Register

Baum
Member since Jul 2013
8 posts
Subject: 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)
Member since May 2011
331 posts
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
Member since Sep 2012
13 posts
Subject: 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
Member since May 2011
79 posts
Quote by nemrak300693 on 2013-07-27, 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
Member since Apr 2012
13 posts
In reply to post #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
Member since May 2011
79 posts
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
Member since Apr 2012
12 posts
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
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:
Go to forum
Powered by the Unclassified NewsBoard software, 20110527-dev, © 2003-8 by Yves Goergen