Not logged in. · Lost password · Register

Page:  previous  1  2 
joan
Member since Apr 2011
15 posts
In reply to post ID 2691
Ist leider nicht so gut wie die andere lösung aber ich wollte mal fragen wo hier noch überall fehler sind :)
Bitte um verbesserungsvorschläge und fehlersuche :D



  1. /* funktionendeklaration*/
  2.  
  3. void init();
  4. volatile static uint16_t liter = 0;
  5.  
  6. /* ISR */
  7.  
  8. ISR(INT0_vect){
  9.     if(liter >= 50000){
  10.         PORTD &= ~(1 << PD0);//Zufluss gesperrt
  11.     }
  12.     if(PORTD == PORTD | ( 1 << PD0){// wenn zufluss offen
  13.         liter++;
  14.     }
  15. }
  16.  
  17. ISR(INT1_vect){
  18.     PORTD ^= (1 << PD3);//toggelt abflusssperre
  19. }
  20.         
  21.  
  22. /* main */
  23.  
  24. void main(void){
  25.     init();
  26.     while(1){
  27.         cli();
  28.         while( PORTD == PORTD & ~(1 << PD3)){//abfluss gesperrt
  29.         sleep_enable();
  30.         sei();
  31.         sleep_cpu();
  32.         sleep_disable();
  33.         cli();
  34.     }
  35.     sei();
  36.  
  37.  
  38. /* abfluss überwachen */
  39.     cli();
  40.     while( PORTD == PORTD | (1 << PD3)){//abfluss offen
  41.         sei();
  42.         uint8_t zustand = PORTD
  43.         if( PORTD != zustand && liter >= 20000){
  44.             cli();
  45.             --liter;
  46.             sei();
  47.         }else{
  48.             cli();
  49.             PORTD &= ~(1 << PD3);
  50.             PORTD |=( 1<<PD=);
  51.             sei();
  52.         }
  53.     }
  54.     sei();
  55. }
This post was edited on 2011-08-02, 23:38 by dom.
Edit reason: code tags hinzugefügt
beckus
LTE, DL1CHB
(Moderator)
Avatar
Member since Oct 2010
101 posts
EDIT: *In neuen Topic verschoben*
E-Mail: christopher.beck@fau.de
GPG-Fingerprint: AE1A C931 2BAF C5A1 F0BE 2083 3117 1121 2F9D 4F14
This post was edited on 2011-08-02, 11:04 by beckus.
morty
SPiC-Meister
(Moderator)
Member since May 2011
331 posts
@beckus: Bitte keine threads enführen! - Bitte mach mit der Frage einen neuen Thread auf....
D.Kay
Member since Oct 2010
15 posts
In reply to post ID 2687
@joan: Wenn ich das richtig verstanden habe, wird sleep_cpu() bei jedem Interrupt verlassen. Also auch wenn ein Interrupt auftaucht, der gar nichts mit deiner Bedingung in der while-Schleife zu tun hat. Somit wird die while-Schleife nicht verlassen, aber nochmal die Bedingung überprüft.
This post was edited on 2011-08-02, 11:15 by D.Kay.
morty
SPiC-Meister
(Moderator)
Member since May 2011
331 posts
In reply to post #16
  • ISR(INT0): Der Ansatz ist gut. Die Logik stimmt noch nicht so 100%
  • ISR(INT1): Das wird wohl zu einem Kontinuierlichen Interrupt führen -> Nochmal genau anschauen was du da machen musst.
  • main: Sauber formatierter Code hilft ungemein!
  • main (überwachen): Warum liest du PORTD unter interruptsperre aus?
  • main (überwachen): Die while-bedingugn wird so nicht funktionieren. (Am besten auch erklären waurm)
  • main (überwachen/if/zustand): Dies wird aus dem gleichen Grund nicht zuverlässig funktionieren, selbst wenn es richtig implementiert wäre.
  • main (überwachen/if,else): Das wird nicht das gewünschte Ergebnis bringen. Bitte nochmal genau mit der Aufgabenstellung vergleichen.

P.s: Code bitte mit [code=c] .... [/code] formatieren.
This post was edited on 2011-08-02, 10:57 by morty.
morty
SPiC-Meister
(Moderator)
Member since May 2011
331 posts
@D.KAy: Auch an dich: Neue Frage, neuer Thread - sonst wird es unübersichtlich....
joan
Member since Apr 2011
15 posts
In reply to post #20
-ISR(INT0): ich verstehe nicht was falsch ist weil ich doch nur einen liter dazuzähle wenn der zufluss geöffnet ist und falls ich über das fassungsvermögen hinauskomme schließe ich das zuflussventil

-ISR(INT1): warum führt das zu einem kontinuierlichen interrupt ich wechsle doch bei jedem ausgelösten interrupt der quelle INT1 von offener abflusssperre zu geschlossener abflusssperre und umgekehrt. Sorry ich komm nicht drauf wo mein denkfehler liegt.

-ich lese PORTD unter interruptsperre aus weil sich ja sonst PORTD während des auslesens durch interrupt INT1 ändern könnte und ich so das falsche lese oder etwa nicht?

- ich dachte mir ich überprüfe so ob das 3. Bit an PORTD gesetzt ist. falls das zutrifft ist ja der abflusshahn offen steht in den informationen zur hardware. und solange der abflusshahn offen ist soll wasser abfließen.

- warum kann man es nicht mit PORTD auslesen?

Sorry steh vil. auf dem Schlauch aber ich verstehe es einfach gerade nicht.
morty
SPiC-Meister
(Moderator)
Member since May 2011
331 posts
....evtl gibt es noch jemand anderes der joan helfen kann? Lesen sollte es ja genug....
D.Kay
Member since Oct 2010
15 posts
Was mir so spontan in der Abflussüberwachung auffällt:
Fliesst innerhalb eines Schleifendurchlaufes kein Liter durch, d.h. wechselt sich der Zustand von PORTD einmal nicht sofort, wird der Abflusshahn geschlossen und die Zuflusssperre geöffnet. Die Zuflusssperre sollte aber erst unter 20.000 Liter wieder geöffnet werden. Bei dir stoppt auch der Abfluss sobald nur noch 19.999 Liter drin sind.
joan
Member since Apr 2011
15 posts
ja stimmt der else zweig ist falsch danke :D .aber soll der abfluss nich stoppen wenn weniger als 20000 liter im tank sind um sich wieder aufzufüllen oder hab ich das falsch verstanden?
danik
Mechatronik
Member since May 2011
6 posts
In reply to post ID 2687
Die while schleife wird doch hier ohnehin verlassen da man sonst aus dem Befehl sleep_cpu nicht herauskommt.
Besten Dank schon mal .

falls sleep_cpu() durch einen anderen interrupt unterbrochen wurde, wird die while-schleife nicht verlassen. das ist der Grund weshalb du überhaupt die while-schliefe hast. somit brauchst du auch das cli() vor jedem testen deiner schlaf-bedingung.
wolfram
Member since Aug 2011
1 post
Frage zur Initialisierung:
ist PD0 ein Makro für 0, oder PD2 ein Makro für 2?
morty
SPiC-Meister
(Moderator)
Member since May 2011
331 posts
Quote by wolfram:
Frage zur Initialisierung:
ist PD0 ein Makro für 0, oder PD2 ein Makro für 2?
Jep P{A,B,C,D}X sind makros für X. Deshalb verwende ich sie auch nicht. Es gibt sie halt, weil es alle Namen das Datenblats zur Verfügung gestellt werden. Meistens macht es Sinn sie zu verwenden - in diesem Fall finde ich es eher verwirrend... ;)
King-Chris
Member since Oct 2012
31 posts
In reply to post ID 2635
Quote by 5er on 2011-07-29, 17:22:
Einfach mal zum drüberschauen.
alles was auf da angabe steht hab ich nicht mehr dazu geschrieben

  1. /*
  2. * Tankkontrolle.c
  3. *
  4. *  Created on: 29.07.2011
  5. *      Author: Manuel
  6. */
  7.  
  8. static volatile uint8_t abgespert = 0;
  9. static volatile uint16_t fill = 0;
  10.  
  11. ISR( INT1_vec) {
  12.     abgespert + 1;
  13.     abgespert %= 2;
  14.     //0 zu 1 oder 1 zu 0
  15. }
  16. ISR( INT0_vec) {
  17.     fill++;
  18.     if (fill >= FILL_MAX) {
  19.         PORTD &= ~(1 << 0);
  20.     }
  21. }

Bei den ISR habe ich nicht wirklich eine bessere Idee, aber dieses abgesperrt+1 und dan %2 wird doch nicht funktionieren oder ? Da kommt doch eigentlich immer 0 raus, man addiert 1 auf 0 teilt durch 2, hat also wieder 0 beim nächsten Durchlauf.
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:
Page:  previous  1  2 
Go to forum
Powered by the Unclassified NewsBoard software, 20110527-dev, © 2003-8 by Yves Goergen