Not logged in. · Lost password · Register
Forum: Grundstudium 2. Semester Informatik (GDI II) SPiC RSS
Gspic 2. Aufgabe (Juli 2009)
Page:  1  2  next 
Panos #1 -- for 2 months · 18 posts
Show profile · Link to this post
Subject: Gspic 2. Aufgabe (Juli 2009)
Ich habe die die 2. Klausuraufgabe (Juli 2009) programmiert, bin mir aber beim Zufluss Überwachen nicht so sicher ob das richtig ist. Wenn jemand Fehler findet, bitte melden. Danke.

  1.  
  2. /*Funktionsdeklarationen, globale Variablen, etc. */
  3.  
  4. static void init(void);
  5. static volatile unsigned int tank = 0;
  6. static volatile uint8_t event = 0;
  7.  
  8.  
  9. /*Unterbrechungsbehandlungsfunktionen */
  10.  
  11. ISR (INT0_vect) {
  12.     if(event ==  0) {
  13.         event = 1;
  14.     else {
  15.         event = 0;
  16.    
  17.  
  18.     }
  19.  
  20. }
  21.  
  22. ISR (INT1_vect) {
  23.     tank--;
  24.     PORTD& = ~1;
  25.    
  26. }
  27.  
  28.  
  29. /* Funktion main */
  30.  
  31. void main(void) {
  32.    
  33.     /*Initialisierung */
  34.     init();
  35.     PORTD &= ~1;
  36.  
  37.  
  38.     /*Warten auf Ereignisse */
  39.     while(1){
  40.        
  41.         while(event == 0){
  42.             sleep_enable();
  43.             sei();
  44.             sleep_cpu();
  45.             sleep_disable();
  46.             cli();
  47.         }
  48.  
  49.         /*Zufluss überwachen */
  50.  
  51.         while(tank<FILL_MAX && event == 1){
  52.             tank++;
  53.             sei();
  54.             event == 1/* event == 1 hat keine Auswirkung auf das Programm. sei() und der nächste Befehl werden atomar ausgeführt. Damit an der Stelle Interrupts bearbeitet werden können, darf nach sei() nicht cli() stehen. */
  55.             cli();
  56.         }
  57.  
  58.         if(tank == FILL_MAX) {
  59.             PORTD|= 1;
  60.             event = 0;
  61.         }
  62.        
  63.  
  64.     }
  65.  
  66.  
  67.        
  68.  
  69. }
  70.  
  71. /*Ende der Funktion main */
  72.  
  73. /*Funktion init */
  74.  
  75. static void init(void){
  76.     DDRD &= ~(1<<2);
  77.     PORTD|=(1<<2);
  78.     DDRD|= 1;
  79.     DDRD &= ~(1<<3);
  80.     PORTD|=(1<<3);
  81.     GICR|= (1<<INT0)|(1<<INT1);
  82.     MCUCR &= ~(1<<ISC01);
  83.     MCUCR |= (1<<ISC00);
  84.     MCUCR &= ~(1<<ISC10);
  85.     MCUCR |= (1<<ISC11);
  86.    
  87. }
This post was edited 4 times, last on 2010-07-27, 09:45 by Panos.
Stefan #2 -- for 2 months · 31 posts
Show profile · Link to this post
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>

#define FILL_MAX 60000

void init();
static volatile unsigned int fill = 0;
static volatile unsigned char ventil = 0; /*zu*/

ISR(INT0_vect){   /*man muss nur bei jeder Flanke den Status ändern*/
    ventil ^= 1;


ISR(INT1_vect){
    fill--;
    PORTD &=~ 1;   /*nach jedem Abfluss kann man das Ventil entsperren*/
}

void main(){
    init();
    sei();

    while(1){
        cli();
        while(!ventil){
            sleep_enabele();
            sei();
            sleep_cpu();
            sleep_disable();
            cli();
        }
        sei(); /*hatte ich vergessen*/
        while(ventil){
            int i;
            cli();
            fill++;
            if(fill>=60000){
               
                PORTD=|1;
                                                }
            sei();



   
        }
    }
}

void init(){
    DDRD |= 1;
    PORTD &=~ 1; /*wichtig entsperren, Rest spare ich mir*/
}[code]
This post was edited on 2010-07-29, 15:43 by Stefan.
Stefan #3 -- for 2 months · 31 posts
Show profile · Link to this post
Wär cool, wenn mal jemand über meinen Code schauen könnte.
Ich bin mir nicht sicher, ob ich beim Zulauf recht habe.
Fraglich ist, ob man vereinfachend annehmen darf, dass die Schleife abgebrochen wird,
und somit der Liter gar nicht gezählt wird, wenn das Ventil schließt.
Panos #4 -- for 2 months · 18 posts
Show profile · Link to this post
Hab mir mal dein Code angeschaut...

1) Deine Variable fill sollte unsigned int sein, sonst passt der Werte-Bereich nicht (fill kann 60000 werden).
2) Deine Variable vent hat etnweder den Wert 0 oder 1, also reicht uint8_t. Weil uint8_t atomar ist, entstehen weniger Nebeläufigkeitsprobleme.
3) Funktioniert deine for-schleife, die liter zählt? Da wird fill nicht hochgezählt... Wieso zählst du bis 1000?
Stefan #5 -- for 2 months · 31 posts
Show profile · Link to this post
Ja du hast recht.
hab des noch mal geändert.
morty (Administrator) #6 -- since Sep 2003 · 730 posts · Location: Erlangen
Show profile · Link to this post
@Stefan
  • Sobald sich der Zufluss öffnet ist dein Tank leer
  • Irgendwo fehlen da noch ein oder zwei cli()
  • die for-Schleife erschließt sich mir noch nicht so ganz.
morty (Administrator) #7 -- since Sep 2003 · 730 posts · Location: Erlangen
Show profile · Link to this post
@Panos: Echt schicke Lösung! Auch wenn der Korrektor wahrscheinlich geflucht hätte, weil es doch ein ganzes Stück von unserer Musterlösung abweicht. :-)
  • Z54: Eigentlich brächte man hier ein NOP();  Aber auch eine schöne Lösung. :-)
Vitali #8 -- for a month · 7 posts
Show profile · Link to this post
Subject: init methode
also das verstehe ich nicht so ganz:

meine init sieht so aus:

void init{

PORTD &= ~(1<<ISC01);   /*Ventilsignal*/
PORTD |= (1<<ISC00);
GICR |= (1<<INT0);

DDRD |= (1<<PD0);   /*Ventilsperre*/
 
PORTD |= (1<<ISC11);  /*Entnahmesignal*/
PORTD &= ~(1<<ISC10);
GICR |= (1<<INT1);

/*Externe Interruptquelle 0 bzw. 1 konfigurieren*/
???????????????
}


1. Hab ich das soweit richtig verstanden?
2. Was soll ich bei dem letzten Teilstück machen?
-Die Register stehen dabei (DDRD, PORTD, MCUCR) aber die Bits nicht.....
morty (Administrator) #9 -- since Sep 2003 · 730 posts · Location: Erlangen
Show profile · Link to this post
Quote by Vitali:
1. Hab ich das soweit richtig verstanden?
Glaub nicht so ganz. PORTD hat nichts mit ISCXX zu tun. Das sind Makros die zur Konfiguration des Interrupts dienen. Steht aber eigentlich auch in der Angabe.


Quote by Vitali:
2. Was soll ich bei dem letzten Teilstück machen?
Die Interrupts konfigurieren. MCUCR/GICR

Quote by Vitali:
-Die Register stehen dabei (DDRD, PORTD, MCUCR) aber die Bits nicht.....
Doch stehen sie:
"Pin als Ausgang konfigurieren: entspr. Bit in DDRA-Reg. auf 1" (Pin 3 = Bit 3)
Solltest du eigentlich in der Rechnerübung mehr als einmal gemacht haben.
Vitali #10 -- for a month · 7 posts
Show profile · Link to this post
so besser??

void init{

GICR |= (1<<INT0);  /*Ventilsignal*/

DDRD &= ~(1<<PD2);   /*Ventilsperre*/
PORTD |= (1<<PD2);

GICR |= (1<<INT1);  /*Entnahmesignal*/

DDRD &= ~(1<<PD3);  /*Externe Interruptquelle 0 bzw. 1 konfigurieren*/
PORTD |= (1<<PD3);

MCUCR &= ~(1<<ISC01);
MCUCR |=  (1<<ISC00);
MCUCR |= (1<<ISC11);
MCUCR &= ~(1<<ISC10);

}
morty (Administrator) #11 -- since Sep 2003 · 730 posts · Location: Erlangen
Show profile · Link to this post
Schau dir das DDRD nochmal an.
Vitali #12 -- for a month · 7 posts
Show profile · Link to this post
Du meinst:

DDRD |= 1;

Ich verstehe nicht warum man da das gesammte Register setzt.
Warum wird Pin0 nicht verwendet?

Und nur so als Faustregel:
DDRD´s immer löschen.
PORT´s immer setzen.

egal ob ein- oder ausgang?!?
morty (Administrator) #13 -- since Sep 2003 · 730 posts · Location: Erlangen
Show profile · Link to this post
Äh, ne! Schau dir die Aufgabenstellung nochmal genau an. Da steht drin, was die Register genau machen.
Vitali #14 -- for a month · 7 posts
Show profile · Link to this post
jetzt aber:


DDRD |= (1<<PD0);     /*Ausgang*/

DDRD &= ~(1<<PD2);    /*Eingänge*/
DDRD &= ~(1<<PD3);
PORTD |= (1<<PD2);
PORTD |= (1<<PD3);

GICR |= (1<<INT0);    /*Interrupts Aktivieren*/
GICR |= (1<<INT1);

MCUCR &= ~(1<<ISC01); /*Interruptquellen Konfiguration*/
MCUCR |=  (1<<ISC00);
MCUCR |= (1<<ISC11);
MCUCR &= ~(1<<ISC10);
This post was edited 2 times, last on 2010-07-29, 15:44 by Vitali.
Stefan #15 -- for 2 months · 31 posts
Show profile · Link to this post
@ morty: so schaut doch mein Programm schon besser aus oder?
Close Smaller – Larger + Reply to this post:
Verification code: VeriCode Please note the verification code from the picture into the text field next to it.
Smileys: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Special characters:
Page:  1  2  next 
Go to forum
Unclassified NewsBoard 1.6.4 © 2003-5 by Yves Goergen
Page created in 637.2 ms (429.9 ms) · 141 database queries in 103.2 ms
Current time: 2010-09-10, 04:09:30 (UTC +02:00)