www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Kapazitätsmessgerät


Autor: Znup (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin moin

ich bin dabei ein Kapazitätsmessgerät zu bauen, und habe auch schon 
einstellbare Konstatstromsenken gebaut, die mir immer exakt 1.3A 
entladen, nun möchte ich gerne per AVR die Spannung kontrollieren und ab 
2.9V abschalten.

Da ich mit einem AVR 3 überwachen möchte weiß ich nicht ganz wie ich das 
am besten angehe. Das ganze soll so funktionieren, dass ich 3 Taster 
habe, pro Zelle einen Taster, drücke ich Taster 1 soll es anfangen zu 
entladen, und der Timer losstarten, alle Sekunden soll er mal die 
Spannung messen, das selbe bei Zelle 2 und 3.

Wie mach ich das am besten mit dem Timer?
Ich habe an der Konstantstromsenke schon einen Eingang vorgestehen, wo 
ich die Entladung abschalten kann, soll heißen, zb. solang am PD0 ne 1 
anliegt, entlädt garnichts, ab Tasterdruck liegt ne 0 an und es entlädt, 
sobald die Spannung der Zelle auf 2.9V gefallen ist, kommt wieder ne 1 
damit sie nicht tiefentladen wird.

Nun weiß ich eben nicht wie ich das mit dem Timer mache, mach ich einen 
Haupttimer, der aktiviert wird beim drücken des ersten Tasters, und bei 
Taster 2 und 3 speichere ich den jeweiligen Timerwert in eine variable 
und rechne danach zurück um auf den Wert zu kommen?

Das ergebnis würde ich dann gerne an einen PC senden, dasheißt sobald 
bei einer Zelle die 2.9V erreicht sind, sendet er die so errechnete 
Kapazität an den PC.

Danke

Schönen Gruß aus Österreich,
Znup

Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja ich würde jetzt einfach 3 globale Variablen anlegen wo der 
Entladestatus für jeden Akku gespeichert ist.
Also wenn der Taster 1 gedrückt wird, setzt du die Variable "stat_akku1 
= 1", für Taster 2 "stat_akku2 = 1" etc.

In der Timer ISR überprüfst du dann einfach welche Variable 1 ist und 
liest dann den entsprechenden ADC-Kanal ein.
Klar alle Spannungen werden dann Synchron aktualisiert, aber das ist 
doch nicht schlimm, oder?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Znup schrieb:

> Nun weiß ich eben nicht wie ich das mit dem Timer mache, mach ich einen
> Haupttimer, der aktiviert wird beim drücken des ersten Tasters,

Würd ich gar nicht machen.
Den Timer würde ich ständig mitlaufen lassen.

Der Timer liefert einen Basistakt von zb 10ms.

Dazu hast du noch 3 Zählvariablen, die jeweils in der Timer-ISR von 100 
auf 0 runtergzählt werden. Ist einer der Zähler 0 geworden, sie ist für 
den jeweiligen Zählkanal damit 1 Sekunde vergangen. das Ist dann in der 
Hauptschleife das Signal, den jeweiligen ADC Kanal zu sampeln und die 
Spannung der Zelle festzustellen. Nach dem Sampeln, wird dann der Zähler 
(sofern nicht überhaupt abgeschaltet werden soll) wieder auf 100 gesetzt 
und das Entladen geht weiter.

Die Zählvariable hat 3 'Zustände'

* eine Zahl größer 0 bedeutet, dass die jeweilige Zeit nach abgewartet
  werden muss, damit 1 Sekunde um ist
* eine 0 bedeutet, dass die Sekunde abgelaufen ist
* eine -1 bedeutet, dass dieser Enladekanal überhaupt inaktiv ist

volatile int8_t  Channel1Wait;
volatile int8_t  Channel2Wait;
volatile int8_t  Channel3Wait;

ISR( .... )      // wird alle 10ms aufgerufen
{
  if( Channel1Wait > 0 )
    Channel1Wait--;

  if( Channel2Wait > 0 )
    Channel2Wait--;

  if( Channel3Wait > 0 )
    Channel3Wait--;
}

int main()
{
   ....
   // Timer so einrichten dass alle 10ms die ISR aufgerufen wird

   // Momentan ist keine Entladung aktiv
   Channel1Wait = -1;
   Channel2Wait = -1;
   Channel3Wait = -1;

   sei();   // und los gehts

   while( 1 ) {

     if( Taste1 gedrückt ) {
       Kapazität1 = 0;
       Channel1Wait = 100;    // 100 * 10 ms -> 1 Sekunde
       Entladung_Kanal_1 einschalten;
     }

     if( Channel1Wait == 0 ) {
       Entladung_Kanal_1 ausschalten;
       ADC Messung Kanal 1 vornehmen;

       if( Messwert < Abschaltspannung )
         Channel1Wait = -1;            // Enladung ist fertig

       else {
         Kapazität +=  Konstante für 1.3A und 1 Sekunde;
         Channel1Wait = 100;           // die nächste Sekunde beginnt
         Entladung_Kanal_1 einschalten;
       }
     }

     if( Taste2 gedrückt ) {
       ....
     }

     if( Channel2Wait == 0 ) {
       ....
     }

     if( Taste3 gedrückt ) {
       ....
     }

     if( Channel3Wait == 0 ) {
       ....
     }
   }
}

Kanal 2 und Kanal 3 gehen völlig analog.
Wenn sich herausstellt, dass der Zeitverlust durch die ADC Messung nicht 
akzeptabel ist, dann müsste man das ebenfalls entflechten und so ein 
bauen, dass keine oder kaum Zeit verloren geht.

Ach ja:
Die ISR ist dann auch noch ein guter Platz um die Dannegger Entprellung 
zur Tastenabfrage einzubauen. Den Teil mit dem Nachladen des Timers 
kannst du dabei getrost aus der Entprellung rauslassen. Wenn die ISR so 
alle 10 bis 15ms aufgerufen wird, ist das perfekt. Der Rest ist dann nur 
Zahlenspielerei um wieder auf die 1 Sekunde zu kommen.

Autor: Znup (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Wow das sieht verdammt gut aus, allerdings verstehe ich nicht, wieso ich 
dazwischen die entladung ausschalten soll, um die Spannung zu messen?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Znup schrieb:
> Hallo!
>
> Wow das sieht verdammt gut aus, allerdings verstehe ich nicht, wieso ich
> dazwischen die entladung ausschalten soll, um die Spannung zu messen?

Aus demselben Grund warum du auch beim Laden die Ladespannung abschalten 
musst. Du misst sonst die Höhe der Ladespannung bzw. bei dir die 'Tiefe' 
der Entladespannung und nicht die Zellenspannung selber.
Damit eine Zelle entlädt, musst du sie mit einem niedrigeren Potential 
verbinden ... einer Senke in die der Strom reinläuft. Du misst sonst die 
Höhe der Spannung dieser Senke, wenn du sie nicht abschaltest.

Wenn du natürlich die Abschaltspannung unter Last festlegen willst, dann 
lässt die die Konstantstromsenke eingeschaltet beim messen. Die 
simuliert dann deine Last.

Autor: Znup (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aja !

Wow danke, aber hab ich dann nicht ein paar ms pro Sekunden Fehler, weil 
ich in der Zeit nicht entlade?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Znup schrieb:
> Aja !
>
> Wow danke, aber hab ich dann nicht ein paar ms pro Sekunden Fehler, weil
> ich in der Zeit nicht entlade?

Ja. Allerdings bewegt sich das nicht im Millisekundenbereich sondern 
darunter. Solange dauert eine ADC Messung dann auch wieder nicht (und 
wie lange die dauert ist bekannt).
Die Frage ist wie gravierend das ist.
Kapazitätsangaben von Akkus sind sowieso eher mehr Schätzwerte als exakt 
definiert.

Interessanter als ob der angegebene Wert jetzt 825 oder 829mAh ist, ist 
ja die Fragestellung: Wie entwickelt sich der Akku über seine Lebenszeit 
gesehen. Im Vergleich zum letzten mal: hat der Wert abgenommen und wenn 
ja um wieviele Prozentpunkte.

Autor: Znup (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
naja 4mAh ist natürlich nicht schlimm, aber es sollte bei einem 1300mAh 
Akku hald schon auf mehr als 100mAh genau gehen, aber ich denke der 
Fehler wird eh weniger als 10mAh sein

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Znup schrieb:
> naja 4mAh ist natürlich nicht schlimm, aber es sollte bei einem 1300mAh
> Akku hald schon auf mehr als 100mAh genau gehen, aber ich denke der
> Fehler wird eh weniger als 10mAh sein

Weniger. Weit weniger.

Mann kann ja auch das zwischenzeitliche abschalten/einschalten in die 
ISR verlagern. Dann stimmt die Zeitdauer vom jeweiligen Starten einer 
Ladung bis zum jeweiligen Abschalten nach 1 Sekunde auf ein paar µs 
genau, egal was in der Zwischenzeit im main passiert.


ISR( .... )      // wird alle 10ms aufgerufen
{
  if( Channel1Wait > 0 ) {

    if( ChannelWait1 == 100 )
      Kanal einschalten;

    Channel1Wait--;

    if( Channel1Wert == 0 )
      Kanal ausschalten;
  }

  ....
}

jetzt ist die Genauigkeit der Zeit nur noch durch die Genauigkeit 
limitiert mit der der Timer tickt plus einem winzig kleinen Jitter in 
der Gesamtzeit, der aus den unterschiedlichen Pfaden durch die if 
resultiert.

Autor: Znup (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So ich hab das ganze mal so programmiert, kannst du mal drüberschauen ob 
das so past?

Interrupt löst leider alle 9,92ms aus.

Und Tastenentprellung hab ich leider noch nicht, da ich mich da noch 
einlesen muss, hab ich bisher leider noch nie gebraucht.
Ebenso hab ich das ganze noch nicht im Interrupt stehen, sondern normal 
im Hauptprogramm.
#include <avr/io.h>
#include <avr/interrupt.h>
 

volatile int8_t  Channel1Wait;
volatile int8_t  Channel2Wait;
volatile int8_t  Channel3Wait;

ISR(TIMER2_COMP_vect)      // wird alle 10ms aufgerufen
{
  if( Channel1Wait > 0 )
    Channel1Wait--;

  if( Channel2Wait > 0 )
    Channel2Wait--;

  if( Channel3Wait > 0 )
    Channel3Wait--;
}

/* ADC initialisieren */
void ADC_Init(void) 
{
 
  uint16_t result;
 
  ADMUX = (1<<REFS0);                   // AVCC Referenzspannung nutzen
  ADCSRA = (1<<ADPS2);     // Frequenzvorteiler
  ADCSRA |= (1<<ADEN);                  // ADC aktivieren
 
  /* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man liest
     also einen Wert und verwirft diesen, um den ADC "warmlaufen zu lassen" */
 
  ADCSRA |= (1<<ADSC);                  // eine ADC-Wandlung 
  while (ADCSRA & (1<<ADSC) );          // auf Abschluss der Konvertierung warten
  /* ADCW muss einmal gelesen werden, sonst wird Ergebnis der nächsten
     Wandlung nicht übernommen. */
  result = ADCW;
}
 
/* ADC Einzelmessung */
uint16_t ADC_Read( uint8_t channel )
{
  // Kanal waehlen, ohne andere Bits zu beeinflußen
  ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F);
  ADCSRA |= (1<<ADSC);            // eine Wandlung "single conversion"
  while (ADCSRA & (1<<ADSC) )     // auf Abschluss der Konvertierung warten
    ;
  return ADCW;                    // ADC auslesen und zurückgeben
}
 

int main()
{  ADC_Init();

   DDRB = (1 << DDB3) | (1 << DDB4) | (1 << DDB5); 
   DDRB &= ~( ( 1 << DDB0 ) | ( 1<<DDB1) | ( 1<<DDB2) );
   
   PORTB=0xFF;

   // Timer 0 konfigurieren
   TCCR2 = (1<<WGM21); // CTC Modus
   TCCR2 =   (1 << CS00) | (1 << CS01);  // Prescaler 64
   // ((1000000/64)/100) = 156
   OCR2 = 156-1;
 
   // Compare Interrupt erlauben
   TIMSK |= (1<<OCIE2);

   // Momentan ist keine Entladung aktiv
   
   uint8_t Kapazitat1;
   
   Channel1Wait = -1;
   Channel2Wait = -1;
   Channel3Wait = -1;

   sei();   // und los gehts

   while( 1 ) 
   {

     if ( !(PINB & (1<<PINB0)) )  // Taste1 gedrückt 
   {
       Kapazitat1 = 0;
       Channel1Wait = 100;    // 100 * 10 ms -> 1 Sekunde
       PORTB &= ~(1<<PB3);    //Entladung_Kanal_1 einschalten;
     }

     if( Channel1Wait == 0 ) 
   {
       PORTB |= (1<<PB3);         //Entladung_Kanal_1 ausschalten;
       

       if( ADC_Read(0) < 593 ) //ADC Messung Kanal 1 vornehmen und kleiner 2.9V;
          Channel1Wait = -1;  //Entladung ist fertig

       else 
     {
         //Kapazitat1 +=  Konstante für 1.3A und 1 Sekunde;
         Channel1Wait = 100;    // die nächste Sekunde beginnt
         PORTB &= ~(1<<PB3);    // Entladung_Kanal_1 einschalten;
       }
     }
/*
     if( Taste2 gedrückt ) {
       ....
     }

     if( Channel2Wait == 0 ) {
       ....
     }

     if( Taste3 gedrückt ) {
       ....
     }

     if( Channel3Wait == 0 ) {
       ....
     }*/
   }
}

Mit deiner Methode die Entladung auszuschalten, brauch ich auch keine 
Angst haben, dass während der Messung auf den Leitungen soviel Spannung 
abfällt, das mir die Messung verfälscht wird richtig?

MfG
Znup

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Znup schrieb:

> Mit deiner Methode die Entladung auszuschalten, brauch ich auch keine
> Angst haben, dass während der Messung auf den Leitungen soviel Spannung
> abfällt, das mir die Messung verfälscht wird richtig?

Das würde ich sagen, ist sicherlich kein großes Problem. Den 
Spannungsabfall kannst du vernachlässigen.

Ich würd das ein/AUsschalten trotzdem in die ISR verlagern und so dem 
Akku noch ein wenig Zeit geben (wenn auch nicht viel) um sich nach dem 
Entladepuls ein wenig zu erholen, ehe dann gemessen wird.

Autor: Znup (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
habs jetzt umgebaut:
#include <avr/io.h>
#include <avr/interrupt.h>
 

volatile int8_t  Channel1Wait;
volatile int8_t  Channel2Wait;
volatile int8_t  Channel3Wait;

ISR(TIMER2_COMP_vect)      // wird alle 10ms aufgerufen
{
  if( Channel1Wait > 0 ) 
  {

    if( ChannelWait1 == 100 )
     PORTB &= ~(1<<PB3);    //Entladung_Kanal_1 einschalten;

    Channel1Wait--;

    if( Channel1Wert == 0 )
     PORTB |= (1<<PB3);     //Entladung_Kanal_1 ausschalten;
  }

  /*if( Channel2Wait > 0 )
    Channel2Wait--;

  if( Channel3Wait > 0 )
    Channel3Wait--;*/
}

/* ADC initialisieren */
void ADC_Init(void) 
{
 
  uint16_t result;
 
  ADMUX = (1<<REFS0);                   // AVCC Referenzspannung nutzen
  ADCSRA = (1<<ADPS2);     // Frequenzvorteiler
  ADCSRA |= (1<<ADEN);                  // ADC aktivieren
 
  /* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man liest
     also einen Wert und verwirft diesen, um den ADC "warmlaufen zu lassen" */
 
  ADCSRA |= (1<<ADSC);                  // eine ADC-Wandlung 
  while (ADCSRA & (1<<ADSC) );          // auf Abschluss der Konvertierung warten
  /* ADCW muss einmal gelesen werden, sonst wird Ergebnis der nächsten
     Wandlung nicht übernommen. */
  result = ADCW;
}
 
/* ADC Einzelmessung */
uint16_t ADC_Read( uint8_t channel )
{
  // Kanal waehlen, ohne andere Bits zu beeinflußen
  ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F);
  ADCSRA |= (1<<ADSC);            // eine Wandlung "single conversion"
  while (ADCSRA & (1<<ADSC) )     // auf Abschluss der Konvertierung warten
    ;
  return ADCW;                    // ADC auslesen und zurückgeben
}
 

int main()
{  ADC_Init();

   DDRB = (1 << DDB3) | (1 << DDB4) | (1 << DDB5); 
   DDRB &= ~( ( 1 << DDB0 ) | ( 1<<DDB1) | ( 1<<DDB2) );
   
   PORTB=0xFF;

   // Timer 0 konfigurieren
   TCCR2 = (1<<WGM21); // CTC Modus
   TCCR2 =   (1 << CS00) | (1 << CS01);  // Prescaler 64
   // ((1000000/64)/100) = 156
   OCR2 = 156-1;
 
   // Compare Interrupt erlauben
   TIMSK |= (1<<OCIE2);

   // Momentan ist keine Entladung aktiv
   
   uint8_t Kapazitat1;
   
   Channel1Wait = -1;
   Channel2Wait = -1;
   Channel3Wait = -1;

   sei();   // und los gehts

   while( 1 ) 
   {

     if ( !(PINB & (1<<PINB0)) )  // Taste1 gedrückt 
   {
       Kapazitat1 = 0;
       Channel1Wait = 100;    // 100 * 10 ms -> 1 Sekunde
     }

     if( Channel1Wait == 0 ) 
   {
             
       if( ADC_Read(0) < 593 ) //ADC Messung Kanal 1 vornehmen und kleiner 2.9V;
          Channel1Wait = -1;  //Entladung ist fertig

       else 
     {
         //Kapazitat1 +=  Konstante für 1.3A und 1 Sekunde;
         Channel1Wait = 100;    // die nächste Sekunde beginnt
       }
     }
/*
     if( Taste2 gedrückt ) {
       ....
     }

     if( Channel2Wait == 0 ) {
       ....
     }

     if( Taste3 gedrückt ) {
       ....
     }

     if( Channel3Wait == 0 ) {
       ....
     }*/
   }
}

Magst du mal drüberschauen ob das so past?

Eine Frage noch undzwar, wenn er auf 2.9V geht, schaltet er aus, aber es 
ist doch ziemlich wahrscheinlich, dass die Spannung am Akku wieder 
leicht steigt, er dadurch also wieder einschaltet etc. etc. etc. ist das 
nicht doof?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Znup schrieb:

> Magst du mal drüberschauen ob das so past?

Sieht für mich gut aus.
Ab in die Hrdware damit und Tests fahren.

> Eine Frage noch undzwar, wenn er auf 2.9V geht, schaltet er aus, aber es
> ist doch ziemlich wahrscheinlich, dass die Spannung am Akku wieder
> leicht steigt

anzunehmen

> er dadurch also wieder einschaltet etc. etc. etc. ist das
> nicht doof?

Tut er nicht.
Wenn die Messung einmal abgeschaltet hat, also Channel1Wait auf -1 
gegangen ist, kommt der Kanal da nur noch mit einem Tastendruck davon 
wieder weg.
   ....
    if( Channel1Wait == 0 ) 
    {
      if( ADC_Read(0) < 593 ) //ADC Messung Kanal 1 vornehmen und kleiner 2.9V;
      ...
mit einem Channel1Wait von -1 schaltet weder die ISR den Kanal wieder 
auf Entladung noch erfolgen weitere Messungen.

Autor: Znup (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Achja, echt super :)

Jetzt muss ich noch schauen, dass ich die Tastenentprellung irgendwie 
hinbekomm und schon kann ich mal tests machen :) sieht ja schon gut aus.

Vielen vielen vielen dank schonmal !!!

MfG
Znup

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Znup schrieb:
> Achja, echt super :)
>
> Jetzt muss ich noch schauen, dass ich die Tastenentprellung irgendwie
> hinbekomm und schon kann ich mal tests machen :) sieht ja schon gut aus.


Nimm die hier

http://www.mikrocontroller.net/articles/Entprellun...

Deinen Timer kannst du so wie er ist schon benutzen.
Den ISR-Teil wandelst du etwas ab, so dass der Timer nicht nachgeladen 
wird
ISR(TIMER2_COMP_vect)      // wird alle 10ms aufgerufen
{
  static uint8_t ct0, ct1, rpt;
  uint8_t i;
 
  i = key_state ^ ~KEY_PIN;                       // key changed ?
  ct0 = ~( ct0 & i );                             // reset or count ct0
  ct1 = ct0 ^ (ct1 & i);                          // reset or count ct1
  i &= ct0 & ct1;                                 // count until roll over ?
  key_state ^= i;                                 // then toggle debounced state
  key_press |= key_state & i;                     // 0->1: key press detect
 
  if( (key_state & REPEAT_MASK) == 0 )            // check repeat function
     rpt = REPEAT_START;                          // start delay
  if( --rpt == 0 ){
    rpt = REPEAT_NEXT;                            // repeat delay
    key_rpt |= key_state & REPEAT_MASK;
  }

  if( Channel ....
    ...

und der Rest (die get_..Funktionen) bleibt so wie er dort angegeben ist.

Noch in den KEY_xxx Makros deine Ports bzw. Pins eintragen und fertig.

Kümmere dich nicht darum, was da genau in der ISR passiert. Das ist 
ziemlich trickreich. Funktioniert aber erste Sahne. Für dich sind nur 
die get_... Funktionen interessant, im Speziellen die get_key_press.

Autor: Znup (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab das Programm gerade mal ans laufen gebracht, funktionierst 
soweit, Entprellung hab ich noch nicht eingebaut, was allerdings 
auffällt, pro Sekunde ist er 8.24ms nicht am entladen. Das sollte wohl 
so nicht sein, sind immerhin fast 1% Fehler oder ?

Autor: Znup (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab gerade herausgefunden, dass irgendwas mit dem Timer nicht past, 
er macht alle 8,24ms einen Interrupt.

Ich benutze den internen RC Oszillator auf 1MHz aber so ungenau kann der 
doch garnicht sein oder ? Hab es auch schon mit einem anderen AtMega8 
ausprobiert, auch 8.24ms.

Berechnet habe ich das einfach mit (1000000Mhz/64/100)-1 also 
Taktfrequenz durch Prescaler durch gewünschte Interrupt pro Sekunde 
minus 1

Past das so nicht ?

Autor: Znup (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok Fehler gefunden es muss natürlich
TCCR2 |=  (1 << CS00) | (1 << CS01);  // Prescaler 64

heißen, hab das Oder vergessen.

Aber trotzdem, 5ms von 1s wird nicht entladen, macht 0.5% der Zeit, das 
ist doch eine Verschlechterung zu der Version ohne das ganze im 
Interrupt geschehen zu lassen, oder nicht ?

Autor: Znup (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
War noch ein Fehler, hab den falschen Prescaler eingestellt gehabt ;)

Jetzt hab ich außerdem noch den 16 Bit Timer verwedendet um exakte 10ms 
zu haben.
nun schaltet er aber immer noch 1% auf nicht entladen.

Das sollte doch kürzer gehen oder ? Wenn ich es aus dem Interrupt 
herauslasse.

Autor: Znup (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann ich das entladung ein und ausschalten wieder in das Hauptprogramm 
werfen, um diese Zeit wo es nicht entlädt so kurz als möglich zu 
bekommen?

Oder gibt es hierbei dann Fehler?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.