Forum: Mikrocontroller und Digitale Elektronik Schrittmotor mit L6208 und Anzeige Frequen und Zeit


von Peter (Gast)


Lesenswert?

Hallo Gemeinde
ich steure mit einem Atmega 1284p einen Schrittmotor mit dem Atmega 
1284p an. Das klappt sehr gut. Er läuft langsam von kleier Drehzahl in 
Stufen hoch und danach in Stufen wieder runter und wieder von vorn.
Als nächstes wollte ich ein Display mit dem I2C Bus ansteuern und mir 
die Zeit und Frequenz anzeigen lassen. In der ersten stufe klappt das. 
In der nächsten Stufe bleibt er hängen und verändert die Drehzahl nicht 
mehr. Kommentiere ich die Ansteuerng des Displays und damit die Anzeige 
aus klappt es wieder. Leider ist mir unklar warum. Habe mal den ganzen 
Code angehängt.
1
#define F_CPU 16000000UL    // Angabe der Quarzfrequenz
2
#include <avr/io.h>        // Einbindung Datei Ausgänge
3
#include <avr/interrupt.h>
4
#include <stdint.h>
5
6
#include <stdbool.h>
7
#include <avr/pgmspace.h>
8
#include "main.h"                // Aufruf „main“
9
#include "i2clcd.h"
10
#include "i2cmaster.h"
11
#include <util/delay.h>
12
13
volatile int16_t loop;       // Globale Variable warten
14
volatile int16_t tcount;     // Globale Variable warten
15
16
void timer1_init()        // Timer 1 16 Bit konfigurieren
17
  {
18
  TCCR1B = (1<<WGM12)|(1<<CS11)|(1<<CS10);  // Einstellung CTC Modus, Prescaler 64
19
  TCNT1=0;           // Initialisiert Timer
20
  OCR1A=6250;          // 50ms = 20Hz 12499 6250=40HZ
21
  TIMSK1|=(1<<OCIE1A);    // Interrupt erlauben
22
  sei();
23
  }
24
25
ISR (TIMER1_COMPA_vect)      // ISR
26
  {
27
  PORTA ^= (1<<PA0);      // Toggeln PA0 für Motor mit 1ms
28
  tcount ++;
29
  }
30
  
31
void start_text_1 (void)
32
  {
33
    lcd_command(LCD_CLEAR);               // LCD-Anzeige löschen
34
  _delay_ms(2);                // warte 2ms
35
  lcd_printlc(1,1," ATB Board1 mit ");      // Zeile 1
36
  lcd_printlc(2,1,"   dem L6208 ");      // Zeile 2
37
  lcd_printlc(3,1," Zeit  Frequenz");      // Zeile 3
38
  lcd_printlc(4,1,"1 25 ms  40 Hz ");      // zeile 4
39
  }
40
41
int main(void)
42
  {  
43
    i2c_init();                          // Starte I2C Bus
44
    lcd_init();                          // Starte I2CLCD
45
    lcd_light(0);                // 0=Licht an, 1=Licht aus
46
    // Display Befehle
47
    lcd_command(LCD_DISPLAYON | LCD_CURSOROFF | LCD_BLINKINGOFF);
48
    // Display ON/OFF / Cursor ON/OFF / Blinken ON/OFF
49
    
50
    start_text_1();                       // Text 1 anzeigen               // Text 2 anzeigen
51
    _delay_ms(2);
52
    
53
  tcount = 0;          // setzt tcount auf 0
54
  timer1_init();        // Initiert Timer (erster Aufruf)
55
  
56
  DDRA  |= (1<<PA0);      // PA 0 auf Ausgang - Clock
57
  DDRA  |= (1<<PA1);      // PA 1 auf Ausgang - CW/CCW, links rechts Lauf
58
  DDRA  |= (1<<PA2);      // PA 2 auf Ausgang - EN - Ein
59
  
60
  DDRC  |= (1<<PC6);
61
  
62
  PORTA |= (1<<PA1);      // CW - Schaltet Drehrichtung auf links
63
  PORTA |= (1<<PA2);      // EN - Motor Einschalten bei 5V
64
  
65
  while(1)          // Beginn Programmschleife while
66
    {
67
    if(tcount == 400)     // Angabe Zeit
68
      {
69
      loop++;
70
      PORTC ^= (1<<PC6);  // toggelt PC6
71
      tcount = 0;
72
      }
73
    if (loop==1)  // Anzeige 2
74
      {
75
      OCR1A = 3749;    // 15 ms =66,6 Hz
76
       _delay_ms(2);
77
      lcd_printlc(4,1,"2 15 ms 66,6 Hz");      // zeile 4
78
       _delay_ms(2);
79
      }
80
    if (loop==2)  // Anzeige 3
81
      {
82
      OCR1A = 1249;    // 5 ms = 200 Hz
83
      _delay_ms(20);
84
      lcd_printlc(4,1,"3 5 ms  200 Hz ");      // zeile 4
85
      _delay_ms(20);
86
      }
87
    if (loop==6)  // Anzeige 4 
88
      {
89
      OCR1A = 249;    // 1 ms = 1000 Hz
90
      _delay_ms(20);
91
      lcd_printlc(4,1,"4 1 ms  1000 Hz");      // zeile 4
92
      _delay_ms(20);
93
      }
94
    if (loop==10)  // Anzeige 5
95
      {
96
      OCR1A = 124;    // 0,5 ms = 2000 Hz
97
      _delay_ms(20);
98
      lcd_printlc(4,1,"5 0,5 ms 2000 Hz");      // zeile 4
99
      _delay_ms(20);
100
      }
101
    if (loop==18)
102
      {
103
      OCR1A = 249;    // 1 ms = 1000 Hz
104
      lcd_printlc(4,1,"6 1 ms  1000 Hz ");      // zeile 4
105
      _delay_ms(2);
106
      }
107
    if (loop==28)
108
      {
109
      OCR1A = 1249;    // 5 ms = 200 Hz
110
      lcd_printlc(4,1,"8 5 ms  200 Hz  ");      // zeile 4
111
      }
112
    if (loop==40)
113
      {
114
      OCR1A = 3749;    // 15 ms = 66,6 Hz
115
      lcd_printlc(4,1,"9 15 ms  66,6 Hz ");      // zeile 4
116
      _delay_ms(2);
117
      }
118
    if (loop==45)
119
      {
120
      loop=0;
121
      }
122
    }              // ende while
123
  }              // ende main
Habe einige Pausen eingefügt, hilft aber nicht.
Hat jemand eine Idee dazu?
LG P

: Verschoben durch User
von Julian W. (julian-w) Benutzerseite


Lesenswert?

Peter schrieb:
> Habe einige Pausen eingefügt, hilft aber nicht.

Was hilft, ist im richtigen Unter-Forum zu posten. Hier gilt:

Hier könnt ihr eure Projekte, Schaltungen oder Codeschnipsel vorstellen 
und diskutieren. Bitte hier keine Fragen posten!

von Peter (Gast)


Lesenswert?

Gut, falsche Forum. Problem bleibt

von Peter (Gast)


Lesenswert?

keiner eine idee?

von Wolfgang (Gast)


Lesenswert?

Peter schrieb:
> In der nächsten Stufe bleibt er hängen und verändert die Drehzahl nicht
> mehr.

Ein µC bleibt nicht hängen, solange er seine Versorgungsspannung hat. Er 
tut genau das, was man ihm gesagt hat ;-)

Es ist z.B. sehr ungünstig auf (tcount == 400) zu prüfen, wenn du die 
Laufzeit von irgenwelchen Funktionsaufrufen nicht im Griff hast. Wie 
leicht passiert es dann, dass deine Schleife länger als ein tcount+Takt 
dauert und die 400 zum Zeitpunkt der Abfrage nie auftaucht. Ein Test auf 
(tcount > 399) ist da sicherer.

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.