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!
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)
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.