ATTiny13: PORTB-Zuweisung funktioniert nicht wie gewünscht.

Gast #5255205
Lesenswert?

ATTiny13, Studio 7, keine Optimierung(-O0)

Die IF-Anweisungen sind wahr und die Zuweisungen werden ausgeführt, aber 
PORTB bleibt auf 0x00.

Warum ist das so?
1
#include <avr/io.h>
2
#include <stdfix.h>
3

4
int main(void)
5
{
6
  short _Fract fx1 = 0.9;
7
  short _Fract fx2 = 0.7;
8
  short _Fract fx;
9

10
  fx = fx1 * fx2;
11
  
12
  if (fx > 0.5)
13
  {
14
    PORTB = (uint8_t)fx;
15
  }
16
  
17
  fx = fx + 0.1;
18
  
19
  if (fx > 0.6)
20
  {
21
    PORTB = (uint8_t)fx;
22
  }
23
}
Gast #5255220
Lesenswert?

Da musste ich gerade erst einmal googeln, was "short" überhaupt für ein 
Datentyp ist. In 30 Jahren habe ich den noch nie gesehen - was für mich 
schon ein ganz großer Wink mit dem Zaunpfahl ist.

short ist ein also ein Integer mit mindestens 16 Bits.

Ich bin ziemlich sicher, dass man besser mit exakten Größen arbeiten 
sollte. In diesem Fall also uint16_t. Dann ist auch klar, was dabei 
heraus kommt und es ist offensichtlich, dass man darin keine 
Fließkommazahlen speichern kann.

Bei plattform-unabhängigen Code sind noch die fast_xxx Typen 
interessant. Da gibt man die mindeste Größe an die man braucht, und der 
Compiler nimmt ggf. was größeres, wenn der Prozessor damit schneller 
umgehen kann.
#5255224
Lesenswert?

Stefan U. schrieb:
> Da musste ich gerade erst einmal googeln, was "short" überhaupt für ein
> Datentyp ist. In 30 Jahren habe ich den noch nie gesehen - was für mich
> schon ein ganz großer Wink mit dem Zaunpfahl ist.

Auf jeden Fall, wer mit C unterwegs ist sollte schon wissen was ein 
short ist ;)
Ist dir das echt noch nie bei C untergekommen? Ich hab das noch vor z.B. 
int8_t gesehen und ich bin auch fast 30 Jahre dabei.
#5255230
Lesenswert?

M. K. schrieb:
> Stefan U. schrieb:
>> Da musste ich gerade erst einmal googeln, was "short" überhaupt für ein
>> Datentyp ist. In 30 Jahren habe ich den noch nie gesehen - was für mich
>> schon ein ganz großer Wink mit dem Zaunpfahl ist.
>
> Auf jeden Fall, wer mit C unterwegs ist sollte schon wissen was ein
> short ist ;)
> Ist dir das echt noch nie bei C untergekommen? Ich hab das noch vor z.B.
> int8_t gesehen und ich bin auch fast 30 Jahre dabei.

"short (int)" und "short _Fract" sind ganz unterschiedliche Datentypen.
Gemeinsam haben sie nur, daß sie die jeweils kurze Version ihrer Art 
sind.
#5255231
Lesenswert?

Ich sehe kein DDRB im Code - Port B Pins sind dann AFAIK alle Inputs.

Bei allen
1
PORTB = (uint8_t)fx;

.. ist fx jeweils kleiner als 1 und damit PortB immer 0 (Null). C rundet 
nicht, es truncated. Wollte man runden muss man die für _Frakt 
zuständige Funktion aufrufen.

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