Show Posts
Pages: 1 ... 3 4 [5] 6 7 ... 232
61  Using Arduino / Programming Questions / Re: Generating 77.5 kHZ on: March 27, 2014, 06:31:03 am
Timer 1 is intended for later use. I already verified and confirmed that pin 3 is working as it should. There must be something wrong with my setup but I still have no idea what it might be.

 I added digitalWrite calls to toggle Pin 5 explicitly into the ISR. Then I had a look with my DSO. --> It is not stuck in the ISR.

-Udo
62  Using Arduino / Programming Questions / Generating 77.5 kHz on: March 26, 2014, 11:21:51 am
In order to better test my dcf77 library http://blog.blinkenlight.net/experiments/dcf77/dcf77-library/ under realistic conditions I want to implement a simple signal emulator. First step is to create a 77 500 Hz carrier. I tried with the code below. I already verified that the timing is correct (by adding digitalWrite + analysis with DSO). However I fail to get any signal on pin 3 (PD3, OC2B).

Obviously something with my timer2 configuration must be wrong. But what? Has anyone any hints for me?

Code:
// 16000000 / 77500 = 206 + 70/155 = 206 + 14/31
const uint8_t ticks_per_period = 206;
// fractional ticks
const uint8_t nominator = 14;
const uint8_t denominator = 31;

const uint8_t pwm_full_carrier      = ticks_per_period / 2;  // ~50  %   duty cycle
const uint8_t pwm_modulated_carrier = ticks_per_period / 8;  // ~12.5% duty cycle


ISR(TIMER2_COMPA_vect) {
    static uint8_t accumulated_fractional_ticks;

    accumulated_fractional_ticks += nominator;
    if (accumulated_fractional_ticks < denominator) {
        OCR2A = ticks_per_period - 1;
    } else {
        OCR2A = ticks_per_period;
        accumulated_fractional_ticks -= denominator;
    }
}

void setup_timer_0() {
    // disable timer 0 interrupts
    TIMSK0 = 0;
}

void setup_timer_1() {
    // disable timer1 interrupts
    TIMSK1 = 0;

    // do not toggle or change timer IO pins
    TCCR1A = 0;      

    // (16000000 / 256) - 1
    OCR1A = 62500 - 1;
    
    // Mode 4, CTC using OCR1A | set prescaler to 256
    TCCR1B = (1<<WGM12) | (1<<CS12);
}

void setup_timer_2() {
     // disable timer2 interrupts during setup
    TIMSK2 = 0;

    // enable OC2B pin for output (digital pin 3)
    DDRD |= 1<<3;

    // The fast Pulse Width Modulation or fast PWM mode (WGM22:0 = 3 or 7) provides a high fre-
    // quency PWM waveform generation option. The fast PWM differs from the other PWM option by
    // its single-slope operation. The counter counts from BOTTOM to TOP then restarts from BOT-
    // TOM. TOP is defined as 0xFF when WGM2:0 = 3, and OCR2A when MGM2:0 = 7. In non-
    // inverting Compare Output mode, the Output Compare (OC2x) is cleared on the compare match
    // between TCNT2 and OCR2x, and set at BOTTOM. In inverting Compare Output mode, the out-
    // put is set on compare match and cleared at BOTTOM.


    TCCR2A = 1<< WGM20 || 1<<WGM21 || // Fast PWM
             1<<COM2B1;               // Clear OC2B on Compare Match

    TCCR2B = 1<<CS20 || // no Prescaler      
             1<<WGM22;  // Fast PWM

    OCR2A = ticks_per_period - 1;  // period length

    OCR2B = pwm_full_carrier;  // duty cycle
    
    // enable match interrupts
    TIMSK2 = 1<<OCIE2A;
}

void setup() {
    setup_timer_0();
    setup_timer_1();
    setup_timer_2();
}

void modulate(const uint8_t duration) {
}

void loop() {
}
63  International / Deutsch / Re: Benutzung von millis() immer möglich ? on: March 03, 2014, 02:39:19 pm
Nein, millis() kann nicht immer verwendet werden.  Jede Bibliothek kann und wird das abschalten wenn es ihr in die Quere kommt. Ein Beispiel wäre etwa meine neue dcf77 Bibliothek: http://blog.blinkenlight.net/experiments/dcf77/dcf77-library/. Allerdings ist es üblich darauf hinzuweisen. Wenn ein Autor das trotzdem nicht tut hast Du eben Pech gehabt.

Und es ist nicht richtig, daß dies nur passiert wenn der Timer überschrieben wird. Meine Library stoppt ihn einfach nur weil es Jitter ins System bringt den ich nicht brauchen kann. Ein anderer (untypischer) Grund wäre um bei Speicherknappheit den Stack zu begrenzen. Es kann eben viele Gründe geben warum eine Library die Timer stoppen will.
64  International / Deutsch / Re: Eigenes Boardlayout on: February 23, 2014, 05:24:34 am
@Eisebaer: "besser" ist immer mit einer Wertung verbunden. D.h. man muss sich fragen "besser bezüglich was". Resonatoren sind billiger und brauchen weniger zusätzliche Bauteile. Deshalb werden die ja bei den neueren Arduinos verbaut. Andererseits sind Quarze nicht nur teurer sondern regelmäßig sehr viel frequenzstabiler als Resonatoren. D.h. wer mit dem Arduino Zeit messen will hat mit Resonatoren schon verloren bevor er anfängt. Deshalb hat mein Blinkenlighty http://www.amazon.de/gp/product/3645651306/?ie=UTF8&camp=1638&creative=6742&linkCode=ur2&site-redirect=de&tag=wwwblinkenlig-21  ja auch einen Quartz und keinen Resonator. Ich finde eine genaue Frequenz eben wichtiger als billigere Produktionskonsten. D.h. ich finde Resonatoren für meine Zwecke schlechter.

Was die Abblockkondensatoren und die Groundplane angeht. Die ganzen Details findet man in den Atmel Application Notes
AVR040: EMC Design Considerations http://www.atmel.com/Images/doc1619.pdf und Atmel AVR042: AVR Hardware Design
Considerations
 http://www.atmel.com/Images/Atmel-2521-AVR-Hardware-Design-Considerations_Application-Note_AVR042.pdf

Insbesondere:
AVR040 Abschnitt 4.6 Power Supply, Power Routing and Decoupling Capacitors
AVR040 Abschnitt 4.7 PCB Layout and Grounding
AVR042 Abschnitt 5.2 General about crystals and ceramic resonators

Beim Blinkenlighty habe ich das im Layout berücksichtigt. http://blog.blinkenlight.net/experiments/hardware/blinkenlighty-layout/. Du kannst genau sehen wie der Quarz so gut wie möglich abgeschirmt ist und wie die Kondensatoren plaziert sind.

Wenn Du kein Englisch magst, Abblockkondensatoren werden auch hier erklärt: http://rn-wissen.de/index.php/Abblockkondensator.
65  International / Deutsch / Re: Eigenes Boardlayout on: February 22, 2014, 10:20:38 am
@Schultewolter: ja, Eagle ist am Anfang hart. Aber sobald es klick gemacht hat wird Dir relativ schnell klar warum Eagle die bessere Wahl ist. Ich fand Eagle am Anfang auch schlimm, das Programm hat es aber echt in sich.

Was den Autorouter angeht: den benutzt man nur wenn man sehr niedrige Anforderungen hat oder wenn man einen sehr teuren Router hat.
66  International / Deutsch / Re: Eigenes Boardlayout on: February 22, 2014, 10:18:49 am
Das sieht ja schnuckelig aus. Aber: Du hast die Kondensatoren für den Quarz vergessen. Die Abblockkondensatoren fehlen. Der Kondensator bei AREF fehlt und unter dem Quarz sollte eine Groundplane liegen.
67  Using Arduino / Installation & Troubleshooting / Re: Why does my project fail with Arduino 1.5.5? on: February 20, 2014, 10:38:18 pm
By now I had a very close look at the compiler output:

Code:
/home/udo/Desktop/arduino-1.0.1/hardware/tools/avr/bin/avr-g++ -c -g -Os -Wall -fno-exceptions -ffunction-sections -fdata-sections -mmcu=atmega328p -DF_CPU=16000000L -MMD -DUSB_VID=null -DUSB_PID=null -DARDUINO=101 -I/home/udo/Desktop/arduino-1.0.1/hardware/arduino/cores/arduino -I/home/udo/Desktop/arduino-1.0.1/hardware/arduino/variants/eightanaloginputs -I/home/udo/Desktop/arduino-1.0.1/libraries/dcf77 /tmp/build8292172423459455253.tmp/MB_Emulator.cpp -o /tmp/build8292172423459455253.tmp/MB_Emulator.cpp.o

<snip>

/home/udo/Desktop/arduino-1.0.1/hardware/tools/avr/bin/avr-gcc -Os -Wl,--gc-sections -mmcu=atmega328p -o /tmp/build8292172423459455253.tmp/MB_Emulator.cpp.elf /tmp/build8292172423459455253.tmp/MB_Emulator.cpp.o /tmp/build8292172423459455253.tmp/dcf77/dcf77.cpp.o /tmp/build8292172423459455253.tmp/core.a -L/tmp/build8292172423459455253.tmp -lm
/home/udo/Desktop/arduino-1.0.1/hardware/tools/avr/bin/avr-objcopy -O ihex -j .eeprom --set-section-flags=.eeprom=alloc,load --no-change-warnings --change-section-lma .eeprom=0 /tmp/build8292172423459455253.tmp/MB_Emulator.cpp.elf /tmp/build8292172423459455253.tmp/MB_Emulator.cpp.eep
/home/udo/Desktop/arduino-1.0.1/hardware/tools/avr/bin/avr-objcopy -O ihex -R .eeprom /tmp/build8292172423459455253.tmp/MB_Emulator.cpp.elf /tmp/build8292172423459455253.tmp/MB_Emulator.cpp.hex
Binary sketch size: 19,400 bytes (of a 30,720 byte maximum)

Code:
avr-g++ -c -g -Os -Wall -fno-exceptions -ffunction-sections -fdata-sections -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=100 -I/usr/share/arduino/hardware/arduino/cores/arduino -I/usr/share/arduino/hardware/arduino/variants/eightanaloginputs -I/usr/share/arduino/libraries/dcf77 /tmp/build8021356485289965020.tmp/MB_Emulator.cpp -o/tmp/build8021356485289965020.tmp/MB_Emulator.cpp.o

<snip>

avr-gcc -Os -Wl,--gc-sections -mmcu=atmega328p -o /tmp/build8021356485289965020.tmp/MB_Emulator.cpp.elf /tmp/build8021356485289965020.tmp/MB_Emulator.cpp.o /tmp/build8021356485289965020.tmp/dcf77/dcf77.cpp.o /tmp/build8021356485289965020.tmp/core.a -L/tmp/build8021356485289965020.tmp -lm
avr-objcopy -O ihex -j .eeprom --set-section-flags=.eeprom=alloc,load --no-change-warnings --change-section-lma .eeprom=0 /tmp/build8021356485289965020.tmp/MB_Emulator.cpp.elf /tmp/build8021356485289965020.tmp/MB_Emulator.cpp.eep
avr-objcopy -O ihex -R .eeprom /tmp/build8021356485289965020.tmp/MB_Emulator.cpp.elf /tmp/build8021356485289965020.tmp/MB_Emulator.cpp.hex
Binary sketch size: 18078 bytes (of a 30720 byte maximum)

So the most obvious difference is the compiler. I checked the version of the compilers:

Code:
avr-gcc: /usr/bin/avr-gcc /usr/bin/X11/avr-gcc
~$ nautilus /usr/bin/avr-gcc
~$ /home/udo/Desktop/arduino-1.0.2/hardware/tools/avr/bin/avr-g++ --version
avr-g++ (GCC) 4.3.2
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

~$ /usr/bin/avr-g++ --version
avr-g++ (GCC) 4.5.3
Copyright (C) 2010 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

So the newer versions of Arduino come with an older compiler. This explains a lot. Is there any reason why Arduino uses 4.3.2 instead of 4.5.3?
68  Using Arduino / Installation & Troubleshooting / Re: Why does my project fail with Arduino 1.5.5? on: February 16, 2014, 02:19:58 am
By now I tried different versions and found that the upgrade from 1.0 to 1.0.1 already causes my project to fail. The upgrade basically bloats the compiled code. It is larger AND slower. The code being slower makes it miss interrupts that it did not miss before.

Has anyone any idea why this happens?
69  Using Arduino / Installation & Troubleshooting / Why does my project fail with Arduino 1.5.5? on: February 15, 2014, 10:45:01 am
Yesterday I upgraded from 1.0 to 1.5.5. Since then my DCF77 clock http://blog.blinkenlight.net/experiments/dcf77/the-clock/ failed to lock to DCF77. As soon as I downgrade everything is fine again. What I noticed is that the compiled code differs significantly in size. I do not mind the size, however it seems that the upgrade disrupts my (critical) timing.

Has anyone a hint for me what exactly changed the compiler behaviour?
70  International / Deutsch / Re: Arduino-Ersatzteile wo kaufen? on: February 10, 2014, 11:55:47 am
Lass den Op Amp doch einfach weg und ersetze die Versorgungsspannungsumschaltung durch eine Steckbrücke. Die automatische Umschaltung habe ich in den letzten 3 Jahren genau 0 mal gebraucht. Von daher vermute ich mal, daß man darauf auch relativ leicht verzichten kann. Eine Steckbrücke brennt nicht wirklich schnell durch, ist resistent gegen elektrostatische Probleme und kann auch leicht durch ein Amperemeter ersetzt werden.
71  International / Deutsch / Re: Warum Arduino??? on: February 10, 2014, 11:36:37 am
Im Dauerbetrieb vieleicht. Aber nicht in einem industriellen Umfeld.
72  International / Deutsch / Re: blink_without_delay für Fortgeschrittene on: February 06, 2014, 11:57:48 am
Falls Du Englisch kannst, Dann schau Dir einfach die Beisspiele in meinem Blog an. Da sind jede Menge Effekte die Blinken ohne in loop irgendwas zu tun.
73  International / Deutsch / Re: Welche RTC? on: February 06, 2014, 11:56:37 am
Das DS3231 Teil hat einen eingebauten Quarz. Und wenn man das Gehäuse größer baut hat man mehr Platz für eine bessere Abschirmung.
74  International / Deutsch / Re: Welche RTC? on: February 05, 2014, 03:04:17 pm
Aus dem gleichen Grund warum der DS3231 keinen externen Quarz braucht UND so genau ist.
75  International / Deutsch / Re: Über eine Strommessung ermitteln, wann Pumpen (Netzspannung) laufen on: February 04, 2014, 12:02:47 pm
Da Du fragen musst hast Du eindeutig zuwenig Ahnung um an Netzspannung herumzubasteln. Also brauchst Du eine Lösung bei der Du nichts an der Netzspannung herumbasteln musst.#

Steck doch eine Master-Slave Steckdosenleiste vor die Pumpe (Master) und ein USB Netzteil als Slave. Ob der Slave dann 5V liefert oder nicht kannst Du mit dem Arduino erkennen.

Alternativ kannst Du auch so ein Kabel wie hier: http://www.amazon.de/Voltcraft-STROMMESSADAPTER-CLA-1L-16/dp/B003A5THHE/ref=sr_1_1?ie=UTF8&qid=1391533783&sr=8-1&keywords=strommessadapter dazwischen stecken. Bei diesem Kabel heben sich die Magnetfelder nicht auf. Ein paar Windungen rein und dann man nachmessen wie hoch die Spannungen abhängig vom Strom denn sind --> fertig ist die "sichere" Überwachung.
Pages: 1 ... 3 4 [5] 6 7 ... 232