Forum: Mikrocontroller und Digitale Elektronik ATtiny85 Arduino IDE micros() funktioniert nicht richtig


von Sven F. (svenf123)


Lesenswert?

Hallo Leute!

Ich wollte mit meinem ATtiny85 ganz einfach im Loop-Programm einen 
digitalen Pin für zwanzig Mikrosekunden auf HIGH setzen und für eine 
zehn Mikrosekunde auf LOW.

Um ihn zu programmieren habe ich mich an folgendes Video gehalten:
https://www.youtube.com/watch?v=i9WOwDrpRKs


Um den digitalen Pin zu schreiben habe ich den micros()-Befehl benutzt.
Als Board habe ich 8MHz eingestellt, da laut Video und dem Internet die 
millis() und micros() Funktionen so am zuverlässigsten arbeiten.

Aber von Zuverlässigkeit ist bei mir nichts zu sehen...
Egal was ich versuche, der digitale Pin bleibt nicht für annähernd zehn 
bzw. zwanzig Mikrosekunden HIGH bzw LOW. Gemessen habe ich ungefähr 100 
bzw 200 Mikrosekunden.

Im Internet habe ich keine Lösung für das Problem gefunden. Man soll nur 
den ATtiny85 @ 8MHz auswählen und alles sollte funktionieren.

Ich habe dann auch mal den _delay_ms() Befehl versucht. Komme aber auf 
das selbe Ergebnis. Auch hab ich mal den ATtiny85@1MHz-Bootloader 
geladen aber wieder das selbe Problem.


Kann mir bitte jemand helfen?
Würde mich sehr freuen!

von Marco G. (grmg2010)


Lesenswert?

Welche Zeiten werden denn stattdessen erreicht? Wie sieht der Code genau 
aus?
Einen 1MHz Bootloader für einen 8MHz Chip?
Läuft der Chip auch mit 8MHz(Clock Div Fuse)

von Christian J. (Gast)


Lesenswert?

Sven Fießer schrieb:
> Um den digitalen Pin zu schreiben habe ich den micros()-Befehl benutzt.
> Als Board habe ich 8MHz eingestellt, da laut Video und dem Internet die
> millis() und micros() Funktionen so am zuverlässigsten arbeiten.
>
> Aber von Zuverlässigkeit ist bei mir nichts zu sehen...

Das gleiche Thema habe ich auch grad, es läuft zehnmal schneller. Der 
Attiny85 gehört ja auch nicht zur Arduino Kollektion sondern den hast du 
dazu gefrickelt. Vergiss es, ich habe mich da auch schon totgesucht wo 
F_CPU noch alles verwendet wird. Da stimmt was mit den AttinyLibs nicht. 
Ich habe eigene delay geschrieben und die Durchlaufzeit verzehnfacht.


Hier steht es richtig: -DF_CPU=1000000L
Nur verwendet wird es nicht, sondern es tickt extakt 10-fach schneller.

C:\Arduino\hardware\tools\avr\bin\avr-g++ -c -g -Os -Wall 
-fno-exceptions -ffunction-sections -fdata-sections -mmcu=attiny84 
-DF_CPU=1000000L -MMD -DUSB_VID=null -DUSB_PID=null -DARDUINO=105 
-IC:\Arduino\hardware\avr\cores\tiny 
C:\Users\cjulius\AppData\Local\Temp\build4729249484552314400.tmp\GPS_Tra 
cker.cpp  -o

von Christian J. (Gast)


Lesenswert?

Hier ist mal die Lib des Attiny85.....wieso der Zirkus mit dem PWM 
abschalten und dem Interrupt aus beim Setzen eines Pins? Habe das 
auskommentiert.
1
// Forcing this inline keeps the callers from having to push their own stuff
2
// on the stack. It is a good performance win and only takes 1 more byte per
3
// user than calling. (It will take more bytes on the 168.)
4
//
5
// But shouldn't this be moved into pinMode? Seems silly to check and do on
6
// each digitalread or write.
7
//
8
__attribute__((always_inline)) static inline void turnOffPWM( uint8_t pin )
9
{
10
  #if CORE_PWM_COUNT >= 1
11
    if ( pin == CORE_PWM0_PIN )
12
    {
13
      Pwm0_SetCompareOutputMode( Pwm0_Disconnected );
14
    }
15
    else
16
  #endif
17
18
  #if CORE_PWM_COUNT >= 2
19
    if ( pin == CORE_PWM1_PIN )
20
    {
21
      Pwm1_SetCompareOutputMode( Pwm1_Disconnected );
22
    }
23
    else
24
  #endif
25
26
  #if CORE_PWM_COUNT >= 3
27
    if ( pin == CORE_PWM2_PIN )
28
    {
29
      Pwm2_SetCompareOutputMode( Pwm2_Disconnected );
30
    }
31
    else
32
  #endif
33
34
  #if CORE_PWM_COUNT >= 4
35
    if ( pin == CORE_PWM3_PIN )
36
    {
37
      Pwm3_SetCompareOutputMode( Pwm3_Disconnected );
38
    }
39
    else
40
  #endif
41
42
  #if CORE_PWM_COUNT >= 5
43
  #error Only 4 PWM pins are supported.  Add more conditions.
44
  #endif
45
46
    {
47
    }
48
49
}
50
51
void digitalWrite(uint8_t pin, uint8_t val)
52
{
53
  uint8_t bit = digitalPinToBitMask(pin);
54
  uint8_t port = digitalPinToPort(pin);
55
  volatile uint8_t *out;
56
57
  if (port == NOT_A_PIN) return;
58
59
  // If the pin that support PWM output, we need to turn it off
60
  // before doing a digital write.
61
  //turnOffPWM( pin ); FIXME
62
63
  out = portOutputRegister(port);
64
65
  if (val == LOW) {
66
    uint8_t oldSREG = SREG;
67
    cli();
68
    *out &= ~bit;
69
    SREG = oldSREG;
70
  } else {
71
    uint8_t oldSREG = SREG;
72
    cli();
73
    *out |= bit;
74
    SREG = oldSREG;
75
  }
76
}
77
78
int digitalRead(uint8_t pin)
79
{
80
  uint8_t bit = digitalPinToBitMask(pin);
81
  uint8_t port = digitalPinToPort(pin);
82
83
  if (port == NOT_A_PIN) return LOW;
84
85
  // If the pin that support PWM output, we need to turn it off
86
  // before getting a digital reading.
87
  //turnOffPWM( pin );    FIXME
88
89
  if (*portInputRegister(port) & bit) return HIGH;
90
  return LOW;
91
}

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.