-
        

Ergebnis 1 bis 8 von 8

Thema: 8 bit D/A Wandler von C in Bacom

  1. #1
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    13.05.2005
    Alter
    26
    Beiträge
    601

    8 bit D/A Wandler von C in Bacom

    Anzeige

    SMARTPHONES & TABLETS-bis zu 77% RABATT-Kostenlose Lieferung-Aktuell | Cool | Unentbehrlich
    Hi,

    nachdem ich heute verzwiefelt versucht habe C zu lehren, um die
    Software diese D/A Wandler zu verstehen:
    http://www.karlsaam.de/karlsaam_cms/node/37
    habe ich es nach langen frustrierenden Versuchen aufgegeben und hoffe nun
    auf Hilfe.

    Das Programm funktioniert wunderbar, bis auf die TAtsache, dass ich es
    net verstehe, und da ich es erstmal in Bascom umsetzen möchte wäre
    ein Verständnis nicht schlecht.

    Das Programm erzeugt mit 8 verschiedenen Wiederständen ein
    Lautsprächer SIgnal. Es kann 8 bit Mono11khzAUdiodatein mit der
    beiligenen Software abspielen.

    Also hier der C Coder (wav.c)

    Code:
    #include "wav.h"
    
     int play=0;
     unsigned char b;
     unsigned long SongPos=0;
    
     void init_wav(void){
    	DDRD=0xff;
    	timer_enable_int(_BV(TOIE1));
    	TCCR1B |= (1<<CS10 | 0<<CS11 | 1<<CS12);
    	TCNT1 = 65535 - (SYSCLK / 1024)/wav_sampling;
    	sei();
     }
    
    SIGNAL (SIG_OVERFLOW1){
    	TCNT1 = 65535 - (SYSCLK / 1024)/wav_sampling;
    	if (play ==1){
    		b=pgm_read_byte_near(WAVE+SongPos);
    		SongPos++;
    		PORTD=b;
    		if (SongPos > wav_size) { play=2; SongPos=0; PORTD=0; }
    	}
    }
    
    
    PROGMEM  unsigned char WAVE[] = {
    0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 
    .....
    /* Zur übersicht weggelassen */
    ...
    0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0x00 };
    Dazu kommt noch der wav.h

    Code:
    #ifndef _WAV_H
       #define _WAV_H
    
       #include <avr/interrupt.h>
       #include <compat/deprecated.h>
       #define SYSCLK 8000000
       #define wav_size 4939
       #define wav_sampling 12000
    
       #include <avr/pgmspace.h>
       extern PROGMEM  unsigned char WAVE[];
       extern int play;
       extern void init_wav(void);
    
    #endif  //_WAV_H
    So die anderen Files sind meiner Meinung nach eher unwichtig können
    aber auf der Seite von Karl Saam runtergeladen werden.
    An dem Programm verstehe ich folgendes net:

    - einmal das wav.h ist mir ein Rätzel, aber ich glaube dieses define
    setzt eine Variable.

    Das ist die Enable von Timer0
    timer_enable_int(_BV(TOIE1));
    Das verstehe ich wieder net:
    TCCR1B |= (1<<CS10 | 0<<CS11 | 1<<CS12);
    Dann

    TCNT1 = 65535 - (SYSCLK / 1024)/wav_sampling;
    dass müste der Timerwert sein oder?

    Was bedeutet der Befehl "sei()" ?

    Und das verstehe ich auch net:
    if (play ==1){
    b=pgm_read_byte_near(WAVE+SongPos);
    SongPos++;
    PORTD=b;
    if (SongPos > wav_size) { play=2; SongPos=0; PORTD=0; }
    Das ist meiner Meinung nach das was den Port dazu bringt ein TOn
    aus dem Lautsprecher zu bringen. Aber da ist keine Loop oder so was
    in der Richtung.

    In der liste sind dann die PWM Signale der 8 Ports, glaube ich, was net
    heißt das es stimmt.

    Zusätzlich hätte ich noch die Frage:
    PORTD=0xHEX ZAHL.
    Kann man die Hex Zahl auch durch einen Binärcode ändern so wie:
    PORTD=0x00101000
    Grüße Furtion

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    29.07.2007
    Beiträge
    386
    es gibt es was :

    http://www.mikrocontroller.net/artic...R-GCC-Tutorial

    brauchst ca 1 jahr dafür um es zu kapieren.

    es gibt auch noch schöne c-bücher für die grundregeln von c.

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    29.07.2007
    Beiträge
    386
    ....Kann man die Hex Zahl auch durch einen Binärcode ändern so wie:
    PORTD=0x00101000.....

    in der neuesten winavr-c-version ab mai 2007

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    13.05.2005
    Alter
    26
    Beiträge
    601
    Hi,

    ich habe mir den Artikel schon durchgelesen, bis zu dem Punkt wo es um
    die I/0s geht, danach habe ich versucht eine LED an und auszuschalten,
    und danach einen andere und danach noch eine.... Was aber nicht
    geklapt hat. Auch die Hilfe von Ulrich Radig hat mir net geholfen und
    das aus der RN Wissen auch net.
    Grüße Furtion

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von Andree-HB
    Registriert seit
    10.12.2004
    Ort
    Bremen
    Alter
    47
    Beiträge
    2.556
    ...wie/warum kann eigentlich ein gesperrter User Beiträge schreiben ???
    Danke an Alle, die uns bei der erfolgreichen 1.000€-Aktion der IngDiba unterstützt haben! | https://www.hackerspace-bremen.de | http://www.pixelklecks.de |

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    13.05.2005
    Alter
    26
    Beiträge
    601
    Hi,

    das habe ich mich auch schon gefragt.
    Grüße Furtion

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    43
    Beiträge
    2.240
    sei = set enable interrupts ... bedeutet, interrupts global eingeschaltet
    Vor den Erfolg haben die Götter den Schweiß gesetzt

  8. #8
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    13.05.2005
    Alter
    26
    Beiträge
    601
    Hi,

    ok "sei()" ist geklärt. Aber was mir noch einfällt wo wird er Prescal gesetzt?
    Grüße Furtion

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •