ATtiny85 Arduino IDE micros() funktioniert nicht richtig

#4138261
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!
Gast #4138365
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
Gast #4138371
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
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren