Te arreglo un poco el código y te comento el problema.
<?php
include 'config.php';
// asegúrate de que en config.php no hay echos ni nada que pueda producir salida.
if (isset ($POST['login']))
{
if (!isset ($POST['nombre'], $POST['pass']) || empty ($POST['pass']) || empty ($POST['pass'])) {
//quito esto de momento porque dicen que no puede haber echos antes de la setcookie
// Pues el error que te da es por eso !!
}
else {
$usr = "SELECT * FROM usuarios WHERE nombre_usuario = '{$POST['nombre']}'";
$resultado = mysql_db_query ($dbnom, $usr);
$usuar = mysql_fetch_array ($resultado);
$POST['pass'] = md5($POST['pass']);
if ($POST['pass'] == $usuar['contraseña'])
setcookie('champ', $_POST['nombre'], time() + 3600);
else
 
; echo 'Usuario o contraseña incorrectos';
}
}
?>
El problema de headers sent es curioso que te salga, porque tienes en una línea comentada que dice que no puedes hacer hechos antes de setcookie.
Hacer echo es igual que ésto.
<?php
//blah blah
?>
esto es como hacer echo
<?php
//blah
?>
En cuanto el servidor web envia un solo byte al cliente, envia también las cabaeceras HTTP, y se hace imposible mandarlas después, y con las cookies lo mismo.
Apostaría a que has metido un salto de línea o un espacio fuera de los tags de php y por eso te sale.
A mí me pasaba mucho al cerrar el tag ?>, el editor, me metía un salto de línea, así que opté por no cerrar los tags en los archivos incluidos.
En cuanto al código, un par de cosas.
Al hacer !$variable supongo que es para comprobar si no está declarada o si está vacía. Mira por que lo he cambiado.
Y usas un operador | en vez de OR comparativo ||.
Espero que haya sido de ayuda.