Not logged in. · Lost password · Register

All posts by Baum (8)

topic: Steigende/Fallende Flanke an einem Pin, Vorinitialisierung als Eingang/Ausgang (März 2010 2a: Tankkontrolle)  in the forum: 2. Semester Grundlagen der systemnahen Programmierung in C
Baum
Member since Jul 2013
8 posts
ich hab das nochmal überarbeitet, was ich mir dabei gedacht habe, steht im Code.

Noch zwei Fragen:

Gibt es Punktabzug wenn ich DDRD |= (1<<1) anstatt DDRD |= (1<<PD1) schreibe?
schreibe ich immer PDx? also z.B. DDRA |= (1<<PD1) oder passt man sich da an den Namen des DDRs an also: DDRA |= (1<<PA1) ???

  1. static void init(void){
  2.  
  3.     DDRD &= ~(1<<1);
  4.     DDRD &= ~(1<<2);
  5.     DDRD &= ~(1<<3);
  6.    
  7.     PORTD |= (1<<1);
  8.     PORTD |= (1<<2);
  9.     PORTD |= (1<<3);
  10.     //bis dahin war ja alles vorgegeben
  11.    
  12.     DDRD |= (1<<0); //Da mir Pin0 nicht von außerhalb gesetzt wird, setze ich Bit0 im DDRD als Ausgang
  13.     PORTD |= (1<<0); //Der Zufluss soll am Anfang geöffnet werden
  14.     GICR |= (1<<INT0)|(1<<INT1); //beide Interrupts im GICR setzen
  15.     MCUCR |= (1<<ISC01)|(1<<ISC00); //Interuptquelle 0 auf steigende Flanke
  16.     MCUCR |= (1<<ISC11);
  17.     MCUCR &= ~(1<<ISC10); //Interruptquelle 1 auf beliebige Flanke
  18.  
  19.     sei();
  20.     sleep_enable(); //ist selbsterklärend
  21. }
This post was edited on 2013-07-24, 21:13 by Baum.
topic: Steigende/Fallende Flanke an einem Pin, Vorinitialisierung als Eingang/Ausgang (März 2010 2a: Tankkontrolle)  in the forum: 2. Semester Grundlagen der systemnahen Programmierung in C
Baum
Member since Jul 2013
8 posts
Subject: Steigende/Fallende Flanke an einem Pin, Vorinitialisierung als Eingang/Ausgang
Hallo,

es geht um die Aufgabe Tankkontrolle (März 2010):
Das Ganze mal Schritt für Schritt:

Zuflusssensor:
was ich machen würde, wäre:
  1. GICR |= (1<<INT0);
  2. MCUCR |= (1<<ISC01)|(1<<ISC00);
aber wie setze ich hier jetzt Bit 2 bei PORTD?

Zuflusssperre:
Die soll ich im Programm dann später ja selber setzen (also das Bit im PORTD) aber setze ich das Bit bei DDRD als Aus- oder Eingang?

Abflusshahn:
was ich hier machen würde:
  1. GICR |= (1<<INT1);
  2. MCUCR &= ~(1<<ISC11);
  3. MCUCR |= (1<<ISC10);
Den Zustand kann ich über Bit3 in PORTD auslesen

Abflusssensor:
Den Zustand würde ich über Bit1 in PORTD auslesen

Im Zweifelsfall würde ich alle Bits, die mit einem Sensor verbunden sind, im PORTD als Ausgang konfigurieren, so klingt es zumindest ganz unten in der Aufgabestellung und die ganzen anderen relevanten Bits als Eingang, ist aber mehr geraten als gewusst, ich bräuchte da wirklich eine Antwort drauf

Wär schön, wenn sich da mal jemand die Zeit nimmt :)
This post was edited 2 times, last on 2013-07-22, 22:27 by Baum.
topic: SPiC Fragestunde  in the forum: 2. Semester Grundlagen der systemnahen Programmierung in C
Baum
Member since Jul 2013
8 posts
In reply to post ID 5955
Könntet ihr euch am Mittwoch etwas mehr Zeit einplanen?
Ich hab ziemlich viele Fragen und denk mal, da bin ich nicht der einzige
topic: Klausur August 2011 (Aufgabe 2a: Countdown)  in the forum: 2. Semester Grundlagen der systemnahen Programmierung in C
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. }
topic: Klausur Juli 2010 (Aufgabe 2a: Wuerfel)  in the forum: 2. Semester Grundlagen der systemnahen Programmierung in C
Baum
Member since Jul 2013
8 posts
Subject: Klausur Juli 2010
Könnte das jemand korrigieren? :)

  1. /*Funktionsdeklarationen, globale Variablen, etc.*/
  2. static void init(void);
  3. static void wait(void);
  4. static void cb(void);
  5. volatile uint8_t hoechstwert;
  6. volatile uint8_t taster;
  7.  
  8. /*Funktion main*/
  9. void main(void){
  10.  
  11.     /*Aufruf der Hardware Initialiserung und Initialisierung der Callback-Funktion*/
  12.     init();
  13.     registerCallbackButton0(cb);
  14.    
  15.    
  16.     /*Initialisierungsphase*/
  17.     while(1){
  18.    
  19.         for(uint8_t i = 1; i<9; i++){         
  20.             PORTC &= ~(1<<i-1);   
  21.             wait()
  22.             if(taster ==1) {
  23.                 hoechstwert =i;
  24.                 break;
  25.             }
  26.         }
  27.         if(taster ==1) break;
  28.         cli();
  29.         PORTC = 0xff;
  30.         sei();   
  31.    
  32.     }
  33.     taster =0;
  34.    
  35.     /*Wuerfelphase*/
  36.     while(1){
  37.         for(uint8_t i = 1; i<=hoechstwert; i++){
  38.             PORTC = ~(1<<(i-1));
  39.             if(taster==1) break;
  40.             if(i == hoechstwert) hoechstwert = 1;
  41.         }
  42.        
  43.         cli();
  44.         taster = 0;
  45.         while(taster!= 1){
  46.             sei();
  47.             sleep_cpu();
  48.             cli();
  49.         }
  50.         taster = 0;
  51.         sei();
  52.     }   
  53. }
  54. /*Ende der Funktion main*/
  55.  
  56. /*Initialisierungsfunktion*/
  57. static void init(void){
  58.     DDRC = 0xff;
  59.     PORTC = 0xff;
  60.     sei();
  61.     sleep_enabble();
  62. }
  63.    
  64. /*Wartefunktion*/
  65. static void wait(void){
  66.     for(volatile uint16_t a = 0; a<1000; a++){}
  67. }
  68.  
  69. /*Callbackfunktion*/
  70. static void cb(void){
  71.     taster = 1;
  72. }
topic: Klausur 2013-03 (Aufgabe 2b - compiledir)  in the forum: 2. Semester Grundlagen der systemnahen Programmierung in C
Baum
Member since Jul 2013
8 posts
In reply to post ID 5986
mit der Abbruchbedinung ist folgendes gemeint (ich sehe nicht, warum das && falsch ist):
links von &&:
d->d_name[i] != '\0'

wenn ich ein Zeichen untersuche, soll das nicht das Nullbyte sein

rechts von &&:
d->d_name[i+1] != '\0'
gleichzeitig darf das nächste Zeichen auch nicht das Nullbyte sein, sonst kann ich ja nicht zwei Zeichen hintereinander abfragen

wenn die Abfragebedingung in der for Schleife geklappt hat, dann kann ich mir
d->d_name[i]
sowie
d->d_name[i+1]
anschauen und prüfen ob sie '.' bzw. 'c' sind

ich komm mal wieder auf dein Beispiel zurück

"0123.c"
wenn i == 4, dann ist d->d_name[4] == '.' und d->d_name[4+1] == 'c', somit sind beide nicht das Nullbyte und die Datei würde kompilieren.

Dagegen z.B. bei
"0123.h"
würde mich die for Schleife bei i == 5 rauswerfen
topic: Klausur 2013-03 (Aufgabe 2b - compiledir)  in the forum: 2. Semester Grundlagen der systemnahen Programmierung in C
Baum
Member since Jul 2013
8 posts
In reply to post ID 5951
hätte das Durchsuchen nach kompilierbaren Dateien auch so funktioniert?

  1.     for(struct dirent *d; (d = readdir(ver))!= NULL; errno = 0){
  2.        
  3.         for(int i = 0; d->d_name[i] != '\0' && d->d_name[i+1] != '\0'; i++){
  4.             if(d->d_name[i] =='.' && (d-> d_name[i+1] == 'c'){
  5.                 compile(d->d_name);
  6.             }
  7.         }      
  8.        
  9.     }
This post was edited on 2013-07-20, 15:19 by Baum.
topic: Klausur April 2009 (Aufgabe 2a: Snake)  in the forum: 2. Semester Grundlagen der systemnahen Programmierung in C
Baum
Member since Jul 2013
8 posts
Subject: Klausur April 2009
Hallo,

kann jemand diese Aufgabe korrigieren (oder zumindest ein paar Teile davon). Hab leider keine Möglichkeit das Programm zu testen, von daher wäre ein feedback sehr hilfreich.

  1. /*Funktionsdeklarationen, globale Variablen etc.*/
  2. void init(void);
  3. void showSnake(int, unsigned char);
  4. void active_wait(volatile unsigned int);
  5. volatile unsigned int len =1;
  6. volatile uint8_t taster;
  7. volatile int pos;
  8.  
  9.  
  10. /*Unterbrechungsbehandlungsfunktion*/
  11. ISR(INT0_vect){
  12.  
  13.     taster++;
  14. }
  15.  
  16.  
  17. /*Funktion main*/
  18. void main(void){
  19.     /*Initialisierung*/
  20.     init();
  21.     sleep_enable();
  22.    
  23.    
  24.     /*Hauptschleife*/
  25.     for(;;){
  26.         /*ein Snake Umlauf*/
  27.         showSnake(pos, len);
  28.         active_wait(5000);
  29.         pos = (pos+1)%6;
  30.         /*Vorbereitung des nächsten Umlaufs bzw. Schlafen*/
  31.         if(pos==0){
  32.             len++;
  33.         }
  34.         cli();
  35.         if(len-taster>0){
  36.             len-=taster;
  37.         } else {
  38.             len = 1;
  39.         }
  40.         taster =0;
  41.         while(len == 6){
  42.             sei();
  43.             sleep_cpu();
  44.             cli();
  45.             pos = 0;
  46.             len = 1;
  47.             if(taster != 0){
  48.                 taster = 0;
  49.                 break;
  50.             }
  51.         }
  52.         sei();
  53.        
  54.     }
  55. }
  56. /*Ende der Funktion main*/
  57.  
  58. /*Funktion init*/
  59. void init (void){
  60.     DDRB |= (1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<4)|(1<<5);
  61.     PORTB |= (1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<4)|(1<<5);
  62.     DDRD &= ~(1<<2);
  63.     PORTD |= (1<<2);
  64.     GICR |= (1<<INT0);
  65.     MCUCR |= (1<<ISC01);
  66.     MCUCR &= ~(1<<ISC00);
  67. }
  68. /*Ende der Funktion init*/
  69.  
  70. /*Funktion active_wait()*/
  71. void active_wait(volatile unigned int len){
  72.  
  73.     for(volatile uint16_t i =0; i<len; i++){}
  74.  
  75. }
  76. /*Ende der Funktion active_wait()*/
  77.  
  78. /*Funktion showSnake()*/
  79. void showSnake(int pos, unsigned char len){
  80.     PORTB |= (1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<4)|(1<<5);
  81.     for(uint8_t i = 0; i<len; i++){
  82.         PORTB &= ~(1<<((pos+6-i)%6));
  83.     }
  84.  
  85. }
  86. /*Ende der Funktion showSnake()*/
This post was edited on 2013-07-20, 15:18 by Baum.
Close Smaller – Larger + Reply to this post:
Special characters:
Go to forum
Powered by the Unclassified NewsBoard software, 20110527-dev, © 2003-8 by Yves Goergen