Amateurfunk Forum

Fragen und Antworten zum Thema Funk
irc
Aktuelle Zeit: Do 21.9.2017 8:44

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
BeitragVerfasst: So 13.11.2016 22:13 
Offline
S8
S8

Registriert: Sa 16.5.2015 21:31
Beiträge: 161
Hallo Gemeinde,

vor einiger Zeit fand ich Pete Julianos (N6QW) "Shirt pocket Transceiver" im Netz.

"Nettes Gerät,", dachte ich mir, "aber das Volumen von umgerechnet 250cm³ müsste sich doch noch etwas unterbieten lassen!?". In seinen Videos sagt Pete, dass der Transceiver eine Ausgangsleistung von 2W hat. Das war dann auch meine angepeilte Marke. Da ich aber Zweifel hatte, ob eine deutliche Volumenreduktion mit bedrahteten Bauelementen möglich ist, kam ich zu dem Schluss, jetzt zu versuchen, den TRX soweit möglich in SMD zu realisieren. Ein Grundstock an SMD-Bauelementen war dank der einschlägigen Dealer in der Elektrobucht schnell angelegt. Als Werkzeug nehme ich eine WELLER WHS40D-Lötstation mit einer 2 mm breiten Spatelspitze, eine Kopflupe mit Stirnband, Pinzetten mit unterschiedlichen Spitzen, Vakuumpumpe, 1mm-Entlötlitze und einen "Mini-Fluxer" von Stannol. Lötzinn ist Standard mit 1mm Durchmesser. Für ganz feine Sachen nehme ich aber Zinn mit 0,5 mm.

Das Platinenmaterial ist das bekannte FR-4. Ich benutze die doppelseitigen UND durchkontaktierten Platinen. Vorteil: Man kann die Schaltung auf der Ober- und der Unterseite aufbauen, was sehr platzsparend ist. Apropos "platzsparend", so sieht das fertige Gerät aus (Frontplatte muss noch beschriftet werden):

Dateianhang:
Micro-QRP-TRX for SSB and the 20m-Band by Peter DK7IH outside1.png


Die Dimensionen meines TRX sind 11 x 7 x 3 cm=231 cm³. YESSS, es wurde tatsächlich kleiner als mein Vorbildgerät von N6QW, wenn auch nicht viel.

Das Innenleben ähnelt weitgehend meiner 20-Meter-Handfunke. Allerdings fehlt das S/RF-Meter (das ist softwaremäßig realisiert), der LM386 wurde durch einen Gegentaktverstärker mit Komplementärtransistoren ersetzt (Beispiel) und das Display ist diesmal kein 2x16 sondern ein graphisches OLED mit 0.96" Diagonale.

Um den Sender nicht zu hoch zu bauen (maximale Höhe im Gehäuse ist 23mm!) habe ich die 2SC2078 im TO-220-Gehäuse durch 2 Stück 2SC1957 im TO-126 ersetzt, Die Senderausgangsleistung beträgt bei Ub=11V 2 Watt und bei UB=12.5V 2.5 Watt. Nach der Fertigstellung des TRX kam der spannende Moment, nämlich die Frage ob mich mit der Mickerleistung überhaupt jemand hören würde. MD0RLA, SP5ZIM/p und EI8BLB hörten und kamen bereits beim ersten Anruf zurück und gaben Empfangsberichte von 57 bis 58. Nicht schlecht für die HF-Leistung mit der jedes Popelhandy "on air" ist! Aber das muss ja auch nur zur nächsten Basisstation kommen. ;-)

Hier der obligate Blick ins Innenleben:
Dateianhang:
Micro-QRP-TRX for SSB and the 20m-Band by Peter DK7IH inside 2.png


Die Widerstände und Kondensatoren in den Dimensionen 0603 und 0805 sind zu 95% auf der Unterseite der Platine montiert, größere SMD- und bedrahtete Komponenten kommen auf die Oberseite. So wird's dann ordentlich kompakt.

Ausblick: Noch mehr Platz ließe sich sparen, wenn man nur 2 NE602 und diese dann für RX und TX gemeinsam benutzt und das SSB Filter jeweils umschaltet. Vielleicht komme ich ja beim nächsten TRX unter die Marke von 220cm³. ;-)

73 de Peter


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

_________________
Selbstbaukram


Nach oben
 Profil  
 
BeitragVerfasst: Mo 14.11.2016 12:13 
Offline
S7
S7

Registriert: Mo 18.8.2014 9:12
Beiträge: 96
Hallo Peter,

ganz große Klasse! Danke auch für den Link zur Originalversion. Schon da muß man sagen, alle Achtung! :D

Hoffe, dass Du nicht mal eines Tages einen Fehler beheben mußt :busch: :shock:

Meine SMD Erfahrung beschränkt sich derzeit auf das Einlöten zweier 8-Beiner, frag mich nicht nach Gehäuseform...
Dafür habe ich mir dann auch direkt eine preiswerte simple SMD Lötstation beo Pollin zugelegt zumal die ICs das Stück 12 Euro gekostet haben und noch zwei weitere auf den Einbau warten.
Mit zunehmenden Alter wird die SMD Geschichte aber nicht einfacher...als Modellbahner würde ich langsam auf LGB umsteigen... :D

73 de Hartmut


Nach oben
 Profil  
 
BeitragVerfasst: Mo 14.11.2016 18:07 
Offline
S8
S8

Registriert: Sa 16.5.2015 21:31
Beiträge: 161
DK5LH hat geschrieben:
Hallo Peter,

ganz große Klasse! Danke auch für den Link zur Originalversion. Schon da muß man sagen, alle Achtung! :D

Hoffe, dass Du nicht mal eines Tages einen Fehler beheben mußt :busch: :shock:


Hallo Hartmut,

danke für's positive Feedback. Das Auswechseln defekter Teile gestaltet sich übrigens nicht ganz so schwierig. Ich finde das Auslöten von SMD-Teilen (außer ICs, das ist ein Problem für sich) viel einfacher als bei bedrahteten Bauteilen. Ich erhitze das Teil abwechselnd an beiden Enden und schnippe es dann irgendwann mit dem Lötkolben einfach weg. Bei Transistoren im SOT-23 wird eine Seite abgelötet, das Teil hochgebogen und dann die andere Seite entfernt. Die Teile fliegen hinterher in den Abfall, bei Preisen im Bereich weniger Cent wird nicht recycled. Auch weil die Teile mechanisch nicht ganz so standfest sind.

DK5LH hat geschrieben:

Mit zunehmenden Alter wird die SMD Geschichte aber nicht einfacher...als Modellbahner würde ich langsam auf LGB umsteigen... :D



Genau das habe ich schon vor Jahren gemacht. Die Z-Sammlung verkauft und den Erlös in LGB investiert. Aber auch nur deshalb weil ich jetzt wesentlich mehr Platz habe und bei Z die Kontaktprobleme den Fahrspaß doch stark reduziert haben. Und dies trotz Staubabdeckung auf der Anlage und regelmäßigem Abwischen der Schienen. Wenn man nur am Putzen ist und kaum zu Fahren kommt, ist das nicht das Gelbe vom Ei. Aber eine aufgebaute LGB-Anlage habe ich natürlich nicht, aber im Sommer wird der Garten manchmal temporär okkupiert. ;-)

vy 73 de Peter

_________________
Selbstbaukram


Nach oben
 Profil  
 
BeitragVerfasst: Mo 14.11.2016 20:40 
Offline
S8
S8

Registriert: Mo 24.2.2014 21:22
Beiträge: 283
Wohnort: Stuttgart
Tolles Projekt! Danke fürs Vorstellen.

_________________
vy 73 Andreas DC3AFA


Nach oben
 Profil  
 
BeitragVerfasst: Di 15.11.2016 11:04 
Offline
S8
S8
Benutzeravatar

Registriert: Fr 30.11.2007 22:00
Beiträge: 1503
Vielen Dank für die Vorstellung Deines Projekts Peter!

Mich würde interessieren wie Du die Softwareseite mit dem OLED realisiert hast? Wir realisierst Du den VFO? Ist da ein Si570 oder DDS drinnen oder ist die Frequenzanzeige ein Zähler?

Fragen über Fragen... :)

73!

Sven


Nach oben
 Profil  
 
BeitragVerfasst: Di 15.11.2016 20:22 
Offline
S8
S8

Registriert: Sa 16.5.2015 21:31
Beiträge: 161
DJ2AT hat geschrieben:
Mich würde interessieren wie Du die Softwareseite mit dem OLED realisiert hast? Wir realisierst Du den VFO? Ist da ein Si570 oder DDS drinnen oder ist die Frequenzanzeige ein Zähler?


Hallo Sven und die anderen Hams auf diesem Kanal,

also, als VFO benutze ich ein DDS mit einem AD9835. Die Clockrate ist 50 MHz, der VFO liegt im Bereich um die 4 MHz (ZF = 9830 kHz). Auf dem Innenfoto des TRX sieht man oben links ein TSSOP-16 Breakoutboard wo der DDS-Chip draufsitzt.

Das OLED habe ich mit einer selbstgeschriebenen Software angesteuert, die in C geschrieben ist. Von dem Oled gibt es 2 Varianten, eine SPI und eine I²C-Variante. Ich nehme letztere. Als Hardware ist ein Arduino Pro Mini verbaut. Allerdings benutze ich das Arduinoboard nur als normales ATMega328-Board, den implementierten Bootloader habe ich mit dem ersten Aufspielen der Software gelöscht. Ich habe mich für diese Lösung mit dem Arduinoboard entschieden, weil das das kleinste Teil war, das erhältlich ist. Und für knapp 4,-€ mache ich mir auch nicht die Mühe, einen ATMega328, einen 16MHz-Quarz und noch die ganze Peripherie auf eine Platine zu löten. Keine Ahnung wie die Chinesen das preislich hinbekommen, aber ich denke ATMEL muss denen noch Geld zahlen, damit sie ihre Chips loswerden. ;-))

Falls Interesse an dem Code für das OLED besteht, könnte ich den gerne zur Verfügung stellen.

vy 73 de Peter

_________________
Selbstbaukram


Nach oben
 Profil  
 
BeitragVerfasst: Di 15.11.2016 23:29 
Offline
S8
S8

Registriert: Mi 25.8.2010 23:37
Beiträge: 2733
Hi Peter

Danke für die Projektvorstellung; ich hab bei meinem 5 Band Transceiver vorallem mit SMD-Bauteilen gebaut; R,C und Transistoren, allerdings nicht auf minimale Grösse getrimmt.
Am Code zum OLED-Display wär ich interessiert, hab eins in I2C rumliegen, aber noch nicht die Zeit gefunden, etwas damit zu machen.


Nach oben
 Profil  
 
BeitragVerfasst: Mi 16.11.2016 0:28 
Offline
S8
S8

Registriert: Sa 16.5.2015 21:31
Beiträge: 161
Hallo zusammen, dann poste ich mal hier den Code für das OLED 1306 mit der SPI-Schnittstelle.

Zuerst den Zeichensatz:

Code:
// Font 5x8 for LCD Display (derived from Nokia 5110 now used for OLED with 1306 chip)
const char fontchar[485] = {
0x00,0x00,0x00,0x00,0x00, // 20 space ASCII table for NOKIA LCD: 96 rows * 5 bytes= 480 bytes
0x00,0x00,0x5f,0x00,0x00, // 21 ! Note that this is the same set of codes for character you
0x00,0x07,0x00,0x07,0x00, // 22 " would find on a HD44780 based character LCD.
0x14,0x7f,0x14,0x7f,0x14, // 23 # Also, given the size of the LCD (84 pixels by 48 pixels),
0x24,0x2a,0x7f,0x2a,0x12, // 24 $ the maximum number of characters per row is only 14.
0x23,0x13,0x08,0x64,0x62, // 25 %
0x36,0x49,0x55,0x22,0x50, // 26 &
0x00,0x05,0x03,0x00,0x00, // 27 '
0x00,0x1c,0x22,0x41,0x00, // 28 (
0x00,0x41,0x22,0x1c,0x00, // 29 )
0x14,0x08,0x3e,0x08,0x14, // 2a *
0x08,0x08,0x3e,0x08,0x08, // 2b +
0x00,0x50,0x30,0x00,0x00, // 2c ,
0x08,0x08,0x08,0x08,0x08, // 2d -
0x00,0x60,0x60,0x00,0x00, // 2e .
0x20,0x10,0x08,0x04,0x02, // 2f /
0x3e,0x51,0x49,0x45,0x3e, // 30 0
0x00,0x42,0x7f,0x40,0x00, // 31 1
0x42,0x61,0x51,0x49,0x46, // 32 2
0x21,0x41,0x45,0x4b,0x31, // 33 3
0x18,0x14,0x12,0x7f,0x10, // 34 4
0x27,0x45,0x45,0x45,0x39, // 35 5
0x3c,0x4a,0x49,0x49,0x30, // 36 6
0x01,0x71,0x09,0x05,0x03, // 37 7
0x36,0x49,0x49,0x49,0x36, // 38 8
0x06,0x49,0x49,0x29,0x1e, // 39 9
0x00,0x36,0x36,0x00,0x00, // 3a :
0x00,0x56,0x36,0x00,0x00, // 3b ;
0x08,0x14,0x22,0x41,0x00, // 3c <
0x14,0x14,0x14,0x14,0x14, // 3d =
0x00,0x41,0x22,0x14,0x08, // 3e >
0x02,0x01,0x51,0x09,0x06, // 3f ?
0x32,0x49,0x79,0x41,0x3e, // 40 @
0x7e,0x11,0x11,0x11,0x7e, // 41 A
0x7f,0x49,0x49,0x49,0x36, // 42 B
0x3e,0x41,0x41,0x41,0x22, // 43 C
0x7f,0x41,0x41,0x22,0x1c, // 44 D
0x7f,0x49,0x49,0x49,0x41, // 45 E
0x7f,0x09,0x09,0x09,0x01, // 46 F
0x3e,0x41,0x49,0x49,0x7a, // 47 G
0x7f,0x08,0x08,0x08,0x7f, // 48 H
0x00,0x41,0x7f,0x41,0x00, // 49 I
0x20,0x40,0x41,0x3f,0x01, // 4a J
0x7f,0x08,0x14,0x22,0x41, // 4b K
0x7f,0x40,0x40,0x40,0x40, // 4c L
0x7f,0x02,0x0c,0x02,0x7f, // 4d M
0x7f,0x04,0x08,0x10,0x7f, // 4e N
0x3e,0x41,0x41,0x41,0x3e, // 4f O
0x7f,0x09,0x09,0x09,0x06, // 50 P
0x3e,0x41,0x51,0x21,0x5e, // 51 Q
0x7f,0x09,0x19,0x29,0x46, // 52 R
0x46,0x49,0x49,0x49,0x31, // 53 S
0x01,0x01,0x7f,0x01,0x01, // 54 T
0x3f,0x40,0x40,0x40,0x3f, // 55 U
0x1f,0x20,0x40,0x20,0x1f, // 56 V
0x3f,0x40,0x38,0x40,0x3f, // 57 W
0x63,0x14,0x08,0x14,0x63, // 58 X
0x07,0x08,0x70,0x08,0x07, // 59 Y
0x61,0x51,0x49,0x45,0x43, // 5a Z
0x00,0x7f,0x41,0x41,0x00, // 5b [
0x02,0x04,0x08,0x10,0x20, // 5c Yen Currency Sign
0x00,0x41,0x41,0x7f,0x00, // 5d ]
0x04,0x02,0x01,0x02,0x04, // 5e ^
0x40,0x40,0x40,0x40,0x40, // 5f _
0x00,0x01,0x02,0x04,0x00, // 60 `
0x20,0x54,0x54,0x54,0x78, // 61 a
0x7f,0x48,0x44,0x44,0x38, // 62 b
0x38,0x44,0x44,0x44,0x20, // 63 c
0x38,0x44,0x44,0x48,0x7f, // 64 d
0x38,0x54,0x54,0x54,0x18, // 65 e
0x08,0x7e,0x09,0x01,0x02, // 66 f
0x0c,0x52,0x52,0x52,0x3e, // 67 g
0x7f,0x08,0x04,0x04,0x78, // 68 h
0x00,0x44,0x7d,0x40,0x00, // 69 i
0x20,0x40,0x44,0x3d,0x00, // 6a j
0x7f,0x10,0x28,0x44,0x00, // 6b k
0x00,0x41,0x7f,0x40,0x00, // 6c l
0x7c,0x04,0x18,0x04,0x78, // 6d m
0x7c,0x08,0x04,0x04,0x78, // 6e n
0x38,0x44,0x44,0x44,0x38, // 6f o
0x7c,0x14,0x14,0x14,0x08, // 70 p
0x08,0x14,0x14,0x18,0x7c, // 71 q
0x7c,0x08,0x04,0x04,0x08, // 72 r
0x48,0x54,0x54,0x54,0x20, // 73 s
0x04,0x3f,0x44,0x40,0x20, // 74 t
0x3c,0x40,0x40,0x20,0x7c, // 75 u
0x1c,0x20,0x40,0x20,0x1c, // 76 v
0x3c,0x40,0x30,0x40,0x3c, // 77 w
0x44,0x28,0x10,0x28,0x44, // 78 x
0x0c,0x50,0x50,0x50,0x3c, // 79 y
0x44,0x64,0x54,0x4c,0x44, // 7a z
0x00,0x08,0x36,0x41,0x00, // 7b <
0x00,0x00,0x7f,0x00,0x00, // 7c |
0x00,0x41,0x36,0x08,0x00, // 7d >
0x10,0x08,0x08,0x10,0x08, // 7e Right Arrow ->
0x78,0x46,0x41,0x46,0x78, // 7f Left Arrow <-
0x00,0x06,0x09,0x09,0x06};  // 80 °


Jetzt die Deklarationen für die I²C/TWI-Funktionen:
Code:
//I²C
void TWIInit(void);
void TWIStart(void);
void TWIStop(void);
uint8_t TWIReadACK(void);
uint8_t TWIReadNACK(void);
uint8_t TWIGetStatus(void);


Die Basisfunktionen für die I²C/TWI-Kommunikation:

Code:
///////////////////////////
//
//         TWI
//
///////////////////////////

void twi_init(void)
{
    //set SCL to 400kHz
    TWSR = 0x00;
    TWBR = 0x0C;
   
    //enable TWI
    TWCR = (1<<TWEN);
}

//Send start signal
void twi_start(void)
{
    TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
    while ((TWCR & (1<<TWINT)) == 0);
}

//send stop signal
void twi_stop(void)
{
    TWCR = (1<<TWINT)|(1<<TWSTO)|(1<<TWEN);
}

void twi_write(uint8_t u8data)
{
    TWDR = u8data;
    TWCR = (1<<TWINT)|(1<<TWEN);
    while ((TWCR & (1<<TWINT)) == 0);
}

uint8_t TWIGetStatus(void)
{
    uint8_t status;
    //mask status
    status = TWSR & 0xF8;
    return status;
}


Und jetzt noch die höheren Funktionen, um etwas auf dem OLED anzuzeigen:

Code:
////////////////////////////////
//
// OLED commands
//
///////////////////////////////
void oled_command(int value)
{
   twi_start();
   twi_write(0x78);
   twi_write(0x00);
   twi_write(value);
   twi_stop();
}

void oled_init(void)
{
    oled_command(0xae);
   
    oled_command(0xa8);//Multiplex ratio
    oled_command(0x3F);
   
    oled_command(0xd3);
    oled_command(0x00);
    oled_command(0x40);
    oled_command(0xa0);
    oled_command(0xa1);
   
   oled_command(0x20); //Adressing mode
    oled_command(0x00); //HOR
   
    oled_command(0xc0);
    oled_command(0xc8);
    oled_command(0xda);
    oled_command(0x12);
    oled_command(0x81);
    oled_command(0xfF);
    oled_command(0xa4); //Display ON with RAM content
    oled_command(0xa6); //Normal display (Invert display = A7)
    oled_command(0xd5);
    oled_command(0x80);
    oled_command(0x8d);
    oled_command(0x14);
    oled_command(0xAF); //Display ON
   
}


//////////////////////////////////
//
//   OLED functions
//
/////////////////////////////////
//Print character in normal size
//Write 8 vertical bits to given col (0..127) and page (0..7)
void oled_write_byte(int col, int page, int val)
{
    int t1;
   
   oled_command(0x21); //COL
   oled_command(col);
   oled_command(col);
   
   oled_command(0x22); //PAGE
   oled_command(page);
   oled_command(page);
      
    twi_start();
   twi_write(0x78);
   twi_write(0x40); //Data
    for(t1 = 0; t1 < 7; t1++)
    {
        twi_write(val);
    }
   twi_stop();
}

void oled_cls(void)
{

    int x, y;
   for(x = 0; x < 128; x++)
   {
       for(y = 0; y < 8; y++)
      {
          oled_write_byte(x, y, 0);
      }
    }   

}

//Print one character in normal size to OLED, *inv*ert if neccessary (inv = 1)
void oled_putchar1(int col, int row, char ch1, int inv)
{
    int p, t1;
    char ch2;
   int c = col;
      
    p = (5 * ch1) - 160;
    for(t1 = 0; t1 < 5; t1++)
    {
       if(!inv)
      {
           ch2 = fontchar[p + t1];
      }
      else
      {
           ch2 = ~fontchar[p + t1];
      }
      
        oled_write_byte(c++, row, ch2);
    }
   
   if(!inv)
   {
       oled_write_byte(c, row, 0x00);
   }
   else
   {
       oled_write_byte(c, row, 0xFF);
   }
   
}

//2^x
int xp2(int xp)
{
    int t1, r = 1;
    for(t1 = 0; t1 < xp; t1++)
    {
        r <<= 1;
    }
    return r;

}


//Print character in double size, inv=1 => inverted
void oled_putchar2(int col, int row, char ch1, int inv)
{
    int p, t1, t2, x;
   int b, b1, b2;
    char colval;
      
    p = (5 * ch1) - 160;
       
   for(t2 = 0; t2 < 6; t2++)
    {
       //Get vertical byte data of char
      if(!inv)
      {
           colval = fontchar[p];
         if(t2 == 5)
         {
             colval = 0;
         }
      }
      else
      {
           colval = ~fontchar[p];
         if(t2 == 5)
         {
             colval = 255;
         }
      }
           
      b = 0;
      x = 1;
       
      for(t1 = 0; t1 < 7; t1++)
        {
            if(colval & x)
            {
               b += xp2(t1 * 2);
               b += xp2(t1 * 2 + 1);
            }
            x <<= 1;
       }
   
        b1 = b & 0xFF; //Lower byte
        b2 = (b & 0xFF00) >> 8; //Upper byte
      
      //Print data to screen
      oled_write_byte(col + t2 * 2, row, b1);
      oled_write_byte(col + t2 * 2, row + 1, b2);
      oled_write_byte(col + t2 * 2 + 1, row, b1);
      oled_write_byte(col + t2 * 2 + 1, row + 1, b2);
      p++;
   }   
   
}

//Print string in given size (lsize=0 => normal height, lsize=1 => double height)
void oled_putstring(int col, int row, char *s, char lsize, int inv)
{
    int c = col;
   
   while(*s)
   {
       if(!lsize)
      {
           oled_putchar1(c, row, *s++, inv);
      }
        else
        {
            oled_putchar2(c, row, *s++, inv);
      }   
      c += (lsize + 1) * 6;
   }
}

//Print an integer/long to OLED
void oled_putnumber(int col, int row, long num, int dec, int lsize, int inv)
{
    char *s = malloc(16);
   if(s != NULL)
   {
       int2asc(num, dec, s, 16);
       oled_putstring(col, row, s, lsize, inv);
       free(s);
   }   
}

void oled_clear_section(int x1, int x2, int row)
{
    int t1;
   for(t1 = x1; t1 < x2; t1++)
   {
       oled_write_byte(t1, row, 0);   
   }

}


Der Initialisierungsteil in main()

Code:
int main(void)
{

       //[..bla bla bla entfernt...]
    
   twi_init();
   oled_init();
   oled_cls();   

      //[..bla bla bla entfernt...]

}



Abschließend noch etwas Hilfskram:

Code:
/********************************/
//
// STRING FUNCTIONS
//
/*******************************/
//INT 2 ASC
int int2asc(long num, int dec, char *buf, int buflen)
{
    int i, c, xp = 0, neg = 0;
    long n, dd = 1E09;

    if(!num)
   {
       *buf++ = '0';
      *buf = 0;
      return 1;
   }   
      
    if(num < 0)
    {
        neg = 1;
       n = num * -1;
    }
    else
    {
       n = num;
    }

    //Fill buffer with \0
    for(i = 0; i < 12; i++)
    {
       *(buf + i) = 0;
    }

    c = 9; //Max. number of displayable digits
    while(dd)
    {
       i = n / dd;
       n = n - i * dd;
   
       *(buf + 9 - c + xp) = i + 48;
       dd /= 10;
       if(c == dec && dec)
       {
           *(buf + 9 - c + ++xp) = '.';
       }
       c--;
    }

    //Search for 1st char different from '0'
    i = 0;
    while(*(buf + i) == 48)
    {
       *(buf + i++) = 32;
    }

    //Add minus-sign if neccessary
    if(neg)
    {
       *(buf + --i) = '-';
    }

    //Eleminate leading spaces
    c = 0;
    while(*(buf + i))
    {
       *(buf + c++) = *(buf + i++);
    }
    *(buf + c) = 0;
   
   return c;
}

//STRLEN
int strlen(char *s)
{
   int t1 = 0;

   while(*(s + t1++));

   return (t1 - 1);
}


So, das sollte alles sein. Ich bin beim Kommentieren immer etwas nachlässig. Falls also Fragen sind, nur zu! ;-)

vy 73 de Peter

_________________
Selbstbaukram


Nach oben
 Profil  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:


Amateurfunk Elektronikforum Physik-Lab Auto Blog Elektroshop PostgreSQL Forum SEO-Blog Inline Skating