Forum: Mikrocontroller und Digitale Elektronik Schaltung geht, ziemlich genau 24H


von Daniel J. (darkmaterial)


Angehängte Dateien:

Lesenswert?

Hallo liebe Forengemeinde,

mein Projekt, (einen BV-32 Standfuss mit Pioneer FB zu bedienen) 
funktioniert mittlerweile ziemlich gut, ich habe nur ein großes Problem. 
Die Schaltung funktioniert nur 24h ^^ Die äussert sich indem sich der 
Fuss anfangs schnell drehen lässt, dies wird dann im Laufe der Zeit 
immer Langsamer, bis schliesslich keine Bewegung mehr stattfindet. Das 
ganze verwirrt mich stark, da nach ca 5 Stunden abstecken alles wieder 
einwandfrei funktioniert. Die Schaltung an sich funktioniert 
Messtechnisch aber die ganze Zeit über. Wiss ihr woran es liegen 
könnte??

VG
Daniel

von Udo S. (urschmitt)


Lesenswert?

42

von Chris (Gast)


Lesenswert?

C-Code Zeile 42 ist ein Fehler!

von Uwe (Gast)


Lesenswert?

AVCC + AGND + AREF Anschließen

VCC --+---+------ AVCC
      |   |
      |   |  +--- AREF
      =   =  =
      |   |  |
GND --+---+--+--- AGND

Alle Cs 100nF
Jeweil dicht wie möglich an den PINs des IC zwischen VCC und GND, AVCC 
und AGND, AREF und AGND.

Noch nen Elektrolyt zwischen VCC und GND ca. 10-100µF.

von Uwe (Gast)


Lesenswert?

Keen Bock wa ?

von Daniel J. (darkmaterial)


Lesenswert?

Tschuldige Dumm von mir ;-)
1
/*
2
 * IRBOSTAND.c
3
 *
4
 *Control B&O Stand with Pioneer TV Control
5
 * Created: 16.03.2013 08:42:19
6
 *  Author: Daniel
7
 */
8
9
# define F_CPU 8000000UL
10
#include <avr/io.h>
11
#include <irmp.h>
12
#include <avr/eeprom.h>
13
#include <stdint.h>
14
/*---------------------------------------------------------------------------------------------------------------------------------------------------
15
 * ATMEL AVR part:
16
 *---------------------------------------------------------------------------------------------------------------------------------------------------
17
 */
18
#if defined (ATMEL_AVR)
19
20
void
21
timer1_init (void)
22
{
23
#if defined (__AVR_ATtiny45__) || defined (__AVR_ATtiny85__)                // ATtiny45 / ATtiny85:
24
25
#if F_CPU >= 16000000L
26
    OCR1C   =  (F_CPU / F_INTERRUPTS / 8) - 1;                              // compare value: 1/15000 of CPU frequency, presc = 8
27
    TCCR1   = (1 << CTC1) | (1 << CS12);                                    // switch CTC Mode on, set prescaler to 8
28
#else
29
    OCR1C   =  (F_CPU / F_INTERRUPTS / 4) - 1;                              // compare value: 1/15000 of CPU frequency, presc = 4
30
    TCCR1   = (1 << CTC1) | (1 << CS11) | (1 << CS10);                      // switch CTC Mode on, set prescaler to 4
31
#endif
32
33
#else                                                                       // ATmegaXX:
34
    OCR1A   =  (F_CPU / F_INTERRUPTS) - 1;                                  // compare value: 1/15000 of CPU frequency
35
    TCCR1B  = (1 << WGM12) | (1 << CS10);                                   // switch CTC Mode on, set prescaler to 1
36
#endif
37
38
#ifdef TIMSK1
39
    TIMSK1  = 1 << OCIE1A;                                                  // OCIE1A: Interrupt by timer compare
40
#else
41
    TIMSK   = 1 << OCIE1A;                                                  // OCIE1A: Interrupt by timer compare
42
#endif
43
}
44
45
#ifdef TIM1_COMPA_vect                                                      // ATtiny84
46
#define COMPA_VECT  TIM1_COMPA_vect
47
#else
48
#define COMPA_VECT  TIMER1_COMPA_vect                                       // ATmega
49
#endif
50
51
ISR(COMPA_VECT)                                                             // Timer1 output compare A interrupt service routine, called every 1/15000 sec
52
{
53
  (void) irmp_ISR();                                                        // call irmp ISR
54
  // call other timer interrupt routines...
55
}
56
57
int
58
main (void)
59
{
60
    IRMP_DATA irmp_data;
61
  uint16_t x;
62
DDRB = 0xFF;
63
DDRD = 0x00;
64
//PORTD |= (1<<PD1) | (1<<PD2); /* Pins PD1 und PD2 "high" */
65
PORTD &= ~( (1<<PD1) | (1<<PD2) );
66
//PORTD=0xFF;
67
    irmp_init();                                                            // initialize irmp
68
    timer1_init();                                                          // initialize timer1
69
    sei ();                                                                 // enable interrupts
70
x=0;
71
    for (;;)
72
    {
73
        if (irmp_get_data (&irmp_data))
74
        {
75
              if (irmp_data.command == 0x001E){
76
                 if (irmp_data.flags & IRMP_FLAG_REPETITION)
77
                 {
78
                  
79
                 }
80
                 else
81
                 {
82
                   if(x==1){
83
        PORTD &= ~(1<<PD0);
84
        x=0;
85
                   }else{
86
                     PORTD |= (1<<PD0);
87
                     x=1;
88
                     }
89
                 }
90
       /* eeprom_write_block(&irmp_data.command, (void *) 0x02,sizeof(&irmp_data.command));
91
        eeprom_write_block(&irmp_data.address, (void *) 0x05,sizeof(&irmp_data.address));
92
        eeprom_write_block(&irmp_data.protocol, (void *) 0x10,sizeof(&irmp_data.protocol));*/
93
       /* PORTD=0xFF;
94
   x==1;*/
95
              }
96
          if (irmp_data.command == 0x0024 && x==1){
97
               if (irmp_data.flags & IRMP_FLAG_REPETITION)
98
               {
99
                 PORTD |= (1<<PD3);
100
                  PORTD |= (1<<PD1);
101
                  _delay_ms(100);   
102
               }
103
               else
104
               { }
105
                 PORTD &= ~(1<<PD3);
106
                PORTD &= ~(1<<PD1);
107
              }
108
          if (irmp_data.command == 0x0025 && x==1){
109
                       if (irmp_data.flags & IRMP_FLAG_REPETITION)
110
                       {
111
                         PORTD |= (1<<PD3);
112
                         PORTD |= (1<<PD2);
113
                         _delay_ms(100);   
114
                       }
115
                       else
116
                       { }
117
                         PORTD &= ~(1<<PD3);
118
                      PORTD &= ~(1<<PD2);
119
                  }
120
  
121
      
122
     
123
           
124
        
125
      
126
    
127
         
128
        }
129
    }
130
}
131
132
133
#endif

von Daniel J. (darkmaterial)


Lesenswert?

Brauch ich AREF AGND und AVCC überhaupt??, da der ADC eig nicht in 
Verwendung ist.

von xvzf (Gast)


Lesenswert?

Ähm bin ich blind oder ist da kein Quellcode??

An der Schaltung kann man eigentlich sogut wie nichts falsch machen, ist 
ja nicht komplex.
Der Fehler liegt also im Quellcode. Wie die anderen zwei auf 42 kommen 
ist mir unklar..
Lad mal deinen Code hoch oder send ihn mir per mail abcbyxvzf [ät] gmail 
[dot]com

evtl. kann ich dir ja Helfen

von Karl H. (kbuchegg)


Lesenswert?

Uwe schrieb:
> Keen Bock wa ?

Nach dem 5-tausendsten mal

* es werden immer alle Vcc/GND Pins angeschlossen, selbst wenn
  sie AVcc bzw. AGnd heißen
* an alle Vcc/GND Pärchen kommt ein 100nF Kondensator
* ein Pullup Widerstand am Reset schadet nicht
* nein, AREF wird normalerweise nicht mit Vcc verbunden, sondern
  einfach nur 100nF nach GND  (ok, trifft hier nicht zu)

verlässt dich auch irgendwann der Enthusiasmus. Vor allen Dingen wenn es 
buchstäblich jedesmal das immer gleiche ist und pro Woche mindestens 10 
mal bei diversen Bitten zur Kontrolle von Schaltungen vorkommt.

von xvzf (Gast)


Lesenswert?

xvzf schrieb:
> Ähm bin ich blind oder ist da kein Quellcode??
>
> An der Schaltung kann man eigentlich sogut wie nichts falsch machen, ist
> ja nicht komplex.
> Der Fehler liegt also im Quellcode. Wie die anderen zwei auf 42 kommen
> ist mir unklar..
> Lad mal deinen Code hoch oder send ihn mir per mail abcbyxvzf [ät] gmail
> [dot]com
>
> evtl. kann ich dir ja Helfen
Sorry, PC hat nicht die ganze Seite angezeigt.

von Daniel J. (darkmaterial)


Lesenswert?

So alle angeschlossen, trotzdem geht nix :/ Der Prozessor reagiert ja 
auch immer richtig, d.h. die LED lässt sich immer schalten (dient dazu 
um "Drehmodus" zu aktivieren) und auch die jeweiligen Pins schliesst er 
brav auf Masse (da wo sie hingehören). Ich glaub fast es liegt an dem 
Fuss ;-)

von als Gast (Gast)


Lesenswert?

Warum ist im Schaltplan ein mega8 und im Code ein tiny45/85?
Vieleicht gibt es dort Probleme bei den Timern (von C versteh ich nur 
Bahnhof) wäre dass, was mir so auffällt.

von Klodeckel (Gast)


Lesenswert?

Guck Dir mal die GND Verbindung an. Die LED kann so auch nicht leuchten, 
oder die Bezeichnungen oben sind falsch.

guude
ts

von Karlo Karlosos (Gast)


Lesenswert?

Eindeutig, der Fehler liegt am fehlenden Source in den folgenden Zeilen:
1
                  }
2
  
3
      
4
     
5
           
6
        
7
      
8
    
9
         
10
        }

Evtl. kommt der Compiler auch nicht mit deiner Formatierung klar, das 
kann ja nichtmal ein Mensch lesen....

von Uwe (Gast)


Lesenswert?

> So alle angeschlossen, trotzdem geht nix
Auch alle Kondensatoren ???

Woher weißt du das ? Ich dachte der "Fehler" tritt nur alle 24h auf !

von Daniel J. (darkmaterial)


Lesenswert?

So ein kleiner Zwischenbericht,
AREF AVCC und AGND angeschlossen, Kondensatoren eingebaut, Schaltung 
gestarten, Fuss dreht sich nicht. Fuss an Labornetzteil mit 14 V und 
"manuellen" Steuerbefehlen-> Fuss dreht sich. Kompiler und Sourcefehler 
schliesse ich eig. aus, da der Atmel beide Transistoren problemlos 
durchschaltet und die Spannungen an der Buchse für den Fuss i.o. sind.

Die Led oben ist falsch eingezeichnet :-) Der Fuss braucht zu drehen GND 
an 1
+14V an 5 und dann je nachdem ob links oder rechstdrehend 3 oder 4 auf 
GND

von Uwe (Gast)


Lesenswert?

Freilaufdioden ???
Ähm der Schalplan ist schlecht ... schlechter am schlech..
Zudem ist GND und 5V vertauscht wasn dis fürn Motor , warum sind da drei 
Transistoren, wo sind die Halbbrücken ?
Neuer Schaltplan bitte .. und info was dis fürn Motor ist.

von Gebhard R. (Firma: Raich Gerätebau & Entwicklung) (geb)


Lesenswert?

Die Ansteuerung deiner Transitoren ist nicht gerade das wahre. Schon mal 
was von Basiswiderstand gehört? Ich schätze, dass dein Mega 8 recht 
heiss wird, und die Ausgänge nix mehr tun wollen. Mach da zumindest 
einen 1K Widerstand zwischen Basis und uC hinein.

Grüsse

von Daniel J. (darkmaterial)


Lesenswert?

Uwe schrieb:
> wasn dis fürn Motor , warum sind da drei
> Transistoren, wo sind die Halbbrücken ?

Gebhard Raich schrieb:
> Mach da zumindest
> einen 1K Widerstand zwischen Basis und uC hinein.

Die beiden brachten des Rätsels Lösung ;-) Dem Motor parallel geschaltet 
ist ein Kondensator ( Ich hab das arme ding jetzt wirklich zerlegt) der 
schlimme Finger hat mir immer meine GND die ich auf die Pins gab 
gekillt. Den Entlad ich jetzt mittels einer Freilaufdiode. Die Ausgänge 
hab ich jetzt mit 1 kOhm versehen, und momentan dreht er wieder. Mal 
schauen was der morgige Tag bringt ;-)
Vielen Dank bis dahin schonmal ;-)

Grüße
Daniel

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.